Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 62 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer From | 21027329 | 515 days ago | IN | 0 ETH | 0.00083264 | ||||
| Transfer From | 21027327 | 515 days ago | IN | 0 ETH | 0.00067525 | ||||
| Transfer From | 21027324 | 515 days ago | IN | 0 ETH | 0.00080537 | ||||
| Transfer From | 15795925 | 1248 days ago | IN | 0 ETH | 0.00175103 | ||||
| Transfer From | 15795924 | 1248 days ago | IN | 0 ETH | 0.00154195 | ||||
| Transfer From | 15795923 | 1248 days ago | IN | 0 ETH | 0.0019481 | ||||
| Transfer From | 15795922 | 1248 days ago | IN | 0 ETH | 0.00159727 | ||||
| Transfer From | 15795921 | 1248 days ago | IN | 0 ETH | 0.00163027 | ||||
| Transfer From | 15795918 | 1248 days ago | IN | 0 ETH | 0.00193825 | ||||
| Transfer From | 15795918 | 1248 days ago | IN | 0 ETH | 0.00148697 | ||||
| Transfer From | 15795918 | 1248 days ago | IN | 0 ETH | 0.00169258 | ||||
| Transfer From | 15795915 | 1248 days ago | IN | 0 ETH | 0.00168439 | ||||
| Transfer From | 15795914 | 1248 days ago | IN | 0 ETH | 0.00174573 | ||||
| Transfer From | 15795913 | 1248 days ago | IN | 0 ETH | 0.00156609 | ||||
| Transfer From | 15795912 | 1248 days ago | IN | 0 ETH | 0.0016956 | ||||
| Transfer From | 15795910 | 1248 days ago | IN | 0 ETH | 0.00055916 | ||||
| Transfer From | 15795910 | 1248 days ago | IN | 0 ETH | 0.0015705 | ||||
| Transfer From | 15795908 | 1248 days ago | IN | 0 ETH | 0.00181883 | ||||
| Transfer From | 15795907 | 1248 days ago | IN | 0 ETH | 0.00157707 | ||||
| Transfer From | 15795905 | 1248 days ago | IN | 0 ETH | 0.00185489 | ||||
| Transfer From | 15795904 | 1248 days ago | IN | 0 ETH | 0.00160851 | ||||
| Transfer From | 15795903 | 1248 days ago | IN | 0 ETH | 0.00165894 | ||||
| Transfer From | 15795902 | 1248 days ago | IN | 0 ETH | 0.00164635 | ||||
| Transfer From | 15795900 | 1248 days ago | IN | 0 ETH | 0.00174955 | ||||
| Transfer From | 15795899 | 1248 days ago | IN | 0 ETH | 0.00170367 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 15496071 | 1291 days ago | 0.12 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MetropolisWorldPassport
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 12 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
//access control
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
// Helper functions OpenZeppelin provides.
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
interface ImageDataInf{
function getCDNImageForElement(string calldata element, uint16 level)external view returns(string memory);
function getIPFSImageForElement(string calldata element, uint16 level)external view returns(string memory);
function getAnnimationForElement(string calldata element)external view returns(string memory);
}
interface TokenURIInf{
function maketokenURi(uint _tokenId, uint wlSpots, uint winChances, uint softClay ) external view returns(string memory);
function contractURI() external view returns (string memory);
}
interface WinContr {
function getReferalIncrease()external view returns(uint16);
function updateAfterLoss(uint passportId, string calldata city, uint32 buildingId)external;
}
contract MetropolisWorldPassport is ERC721Enumerable, Ownable, AccessControl {
address private IMAGE_DATA_CONTRACT;
ImageDataInf ImageContract;
address private WIN_CONTRACT;
WinContr WinContract;
address private WL_CONTRACT;
address private TURI_CONTRACT;
TokenURIInf TuriContract;
//defining the access roles
bytes32 public constant UPDATER_ROLE = keccak256("UPDATER_ROLE");
//bytes32 public constant BALANCE_ROLE = keccak256("BALANCE_ROLE");
bytes32 public constant CONTRACT_ROLE = keccak256("CONTRACT_ROLE");
//payment split contract
address payable private _paymentSplit;
// The tokenId is the NFTs unique identifier, it's just a number that goes
// 0, 1, 2, 3, etc.
using Counters for Counters.Counter;
Counters.Counter private _tokenIds; //counter for token ids
//updateable variables
uint32 public _mintLimit = 5000;
uint16 public _maxAllowedPerWallet = 301; //maximum allowed to mint per wallet
string private _oddAvatar = "nomad";
string private _evenAvatar = "citizen";
uint256 public _navPrice = 0.12 ether;
struct AccessToken {
uint256 id;
uint32 winChances;
uint32 softClay; // max is 4 billion
string name;
string rank;
string description;
string image;
string animation;
string cdnImage;
string element;
string avatarWl;
uint256[] whitelistSpots;
}
string[] elements = ["Fire", "Water", "Air", "Space", "Pixel", "Earth"];
//store the list of minted tokens metadata to thier token id
mapping(uint256 => AccessToken) nftAccessTokenAttribute;
//give away wallets
mapping(address=>uint16) _freeMintable; //winners of free passport are mapped here and can mint for free.
mapping(bytes => bool) _signatureUsed;
//set up functions
constructor(address imageContract, address admin) ERC721("Metropolis World Passport", "METWA") {
//require(imageContract != address(0));
IMAGE_DATA_CONTRACT = imageContract;
ImageContract = ImageDataInf(IMAGE_DATA_CONTRACT);
// I increment _tokenIds here so that my first NFT has an ID of 1.
_tokenIds.increment();
_grantRole(DEFAULT_ADMIN_ROLE, admin);
_grantRole(UPDATER_ROLE, msg.sender);
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
//overides
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC721Enumerable ,AccessControl)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId)
internal
override(ERC721Enumerable)
{
super._beforeTokenTransfer(from, to, tokenId);
}
function contractURI() public view returns (string memory) {
return TuriContract.contractURI();
}
/**
* @dev Set up the addrese for other contracts which interact with this contract.
* @param winContract The address of the win chances contract.
* @param wlContract The address of the Whitelist Contract.
* @param turiContract The address of the Token URI contract
* @notice Can only be called by wallets with UPDATER_ROLE
*/
function setWLContractAddress(address payable paymentContract, address winContract, address wlContract, address turiContract)external onlyRole(UPDATER_ROLE){
// require(winContract != address(0));
// require(wlContract != address(0));
// require(turiContract != address(0));
WIN_CONTRACT = winContract;
WinContract = WinContr(WIN_CONTRACT);
WL_CONTRACT = wlContract;
TURI_CONTRACT = turiContract;
TuriContract = TokenURIInf(TURI_CONTRACT);
_paymentSplit = paymentContract;
}
function setImageContract(address imageContract)external onlyRole(UPDATER_ROLE){
require(imageContract != address(0));
IMAGE_DATA_CONTRACT = imageContract;
ImageContract = ImageDataInf(IMAGE_DATA_CONTRACT);
}
//minting functions
function _internalMint(address toWallet, uint32 winChance)internal {
uint256 newItemId = _tokenIds.current();
// make sure not above limit of available mints.
require(newItemId <= _mintLimit, "To many minted");
//make sure not already got 1
require(balanceOf(toWallet) < _maxAllowedPerWallet, "address already owns max allowed");
//randomly assign the element
string memory elm = elements[newItemId % 6];
//randomly assign the chracter WL spot.
string memory avwl = _oddAvatar;
if (newItemId % 2 == 1) {
//is an odd number
avwl = _evenAvatar;
}
_safeMint(toWallet, newItemId);
nftAccessTokenAttribute[newItemId] = AccessToken({
id: newItemId,
winChances: winChance,
softClay: 0,
rank: "Navigator",
name: "Metropolis World Passport",
description: "The Metropolis World Passport provides access to the vast and ever-expanding world of Metropolis. With your Passport, you will be able to unlock your gamer profile, have a guaranteed WL for one of our avatars, a chance at owning a unique 1x1 property in one of our cities, as well as access to special events and experiences. As you immerse yourself within Metropolis World your Passport will evolve, giving you a unique gateway into the capital cities of the Metaverse.",
image: ImageContract.getIPFSImageForElement(elm, 1),
cdnImage: ImageContract.getCDNImageForElement(elm, 1),
animation: ImageContract.getAnnimationForElement(elm),
element: elm,
avatarWl: avwl,
whitelistSpots: new uint256[](0)
});
// Increment the tokenId for the next person that uses it.
_tokenIds.increment();
}
/**
* @dev Used internally to mint free passports and send them to addreses eg. comp winners.
* @param toWallet The address which the passport will be minted too.
* @notice Can only be called by wallets with UPDATER_ROLE
*/
function freeMint(address toWallet)external onlyRole(UPDATER_ROLE) {
_internalMint(toWallet, 1);
}
/**
* @dev Used by users who hvae been awarded a free passport. Checks against the list of approved wallets
*/
function userFreeMint(uint16 mints)external{
require(_freeMintable[msg.sender] >= mints, "not on the free mint list");
for(uint16 i; i < mints; i++){
//as comp winners they get an extra win chance too
_internalMint(msg.sender, 2);
//remove free mint ability
_freeMintable[msg.sender] -= 1;
}
}
function myFreeMints()external view returns(uint16){
return _freeMintable[msg.sender];
}
function recoverSigner(bytes32 hash, bytes memory signature) internal pure returns (address) {
bytes32 messageDigest = keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
hash
)
);
return ECDSA.recover(messageDigest, signature);
}
/**
* @dev Bulk minitng function for users.
* @param numberOfMints the number of passports to be minted.
* @param toAddress the address the nft is going to.
* @param referrerTokenId the passport ID of the referrer, pass 0 if there is no referall.
*/
function bulkMint(uint16 numberOfMints, address toAddress, uint256 referrerTokenId, bytes32 hash, bytes memory signature)external payable {
require(recoverSigner(hash, signature)==owner(),"invalid signature");
require(!_signatureUsed[signature], "Signature has already been used.");
require(numberOfMints < _maxAllowedPerWallet, "Trying to mint more then max allowed per wallet" );
require(msg.value >= (numberOfMints * _navPrice), "not paid enough");
require(balanceOf(msg.sender) < _maxAllowedPerWallet - numberOfMints, "address already owns max allowed");
require(_tokenIds.current() + numberOfMints - 1 <= _mintLimit, "Will take you over max supply");
_signatureUsed[signature] = true;
for(uint16 i; i < numberOfMints; i++){
if (referrerTokenId != 0){
referralMint(referrerTokenId, toAddress);
}else{
_internalMint(toAddress, 1);
}
}
//return the excess if any
if (msg.value > (numberOfMints * _navPrice)){
Address.sendValue(payable(msg.sender), (msg.value - (numberOfMints * _navPrice)));
}
}
/**
* @dev Standard minitng with the added functionaility of a referal mechamisum.
* @param referrerTokenId The token id of the passport refering the mint
*/
function referralMint(uint256 referrerTokenId, address toAddress) internal {
//tokenId is the Id of the Token referring the new mint.
//this function increases win chances for each person refeered
uint256 newItemId = _tokenIds.current();
require(referrerTokenId < newItemId, "Invalid token ID");
//require(referrerTokenId != 0, "Invalid token ID");
_internalMint(toAddress, 2);
nftAccessTokenAttribute[referrerTokenId]
.winChances += WinContract.getReferalIncrease();
}
//Whitelist Functions
// all the functions which created the proccess of adding or removing WL from the passport
//city WL spots
/**
* @dev used by the WL contract to attache whitlis spots for cities to passport.
* @param wlId The ID of the WL being attached
* @param passportId the token ID of the passport which the WL is being attcahed to.
* @notice only callable by a wallet/contract with the CONTRACT_ROLE
*/
function attachWLSpot(uint wlId, uint passportId)external onlyRole(CONTRACT_ROLE){
//called from the WL contract adds WL to passport for city drop.
nftAccessTokenAttribute[passportId].whitelistSpots.push(wlId);
}
/**
* @dev Get the WL spots a particular passport has.
* @param passportId The token id of the passport
*/
function getWLSpots(uint passportId)external view returns(uint[] memory){
return nftAccessTokenAttribute[passportId].whitelistSpots;
}
function detachCityWLSpot(uint passportId, uint index)external onlyRole(CONTRACT_ROLE){
//called from the WL contract.
nftAccessTokenAttribute[passportId].whitelistSpots[index] = nftAccessTokenAttribute[passportId].whitelistSpots[nftAccessTokenAttribute[passportId].whitelistSpots.length-1];
nftAccessTokenAttribute[passportId].whitelistSpots.pop();
}
//avatar whitelist spots
function contractRemoveAvatarWL(uint256 tokenId, address owner)
external
onlyRole(CONTRACT_ROLE)
{
// when the user mints the avatar this is called by that contract and the WL is removed from the passport
// can also be used to manually remove spot
// we assume the avatar contract has checked the WL spot is correct.
// check owner owns passport
require(ownerOf(tokenId) == owner, "owner needs to own the passport");
nftAccessTokenAttribute[tokenId].avatarWl = "none";
}
function manualAddAvatarWL(uint256 tokenId, string calldata avatar)
external
onlyRole(UPDATER_ROLE)
{
// for us to manually add a WL spot to the passport.
nftAccessTokenAttribute[tokenId].avatarWl = avatar;
}
function checkAvatarWL(uint passportId)external view returns(string memory av){
return nftAccessTokenAttribute[passportId].avatarWl;
}
function setAvatarWLNames(string calldata odd, string calldata even)
external
onlyRole(UPDATER_ROLE)
{
_oddAvatar = odd;
_evenAvatar = even;
}
//Win Chance functions
function userUpdateAfterLoss(uint passportId, string calldata city, uint32 buildingId)external{
//called by user to update thier win chances after they loose
require(ownerOf(passportId)==msg.sender, "You must own the passport to claim win chance increases");
WinContract.updateAfterLoss(passportId, city, buildingId);
}
function increaseWinChance(uint passportId, uint16 inc)external onlyRole(CONTRACT_ROLE){
nftAccessTokenAttribute[passportId].winChances += inc;
}
function decreaseWinChance(uint passportId, uint16 dec)external onlyRole(CONTRACT_ROLE){
nftAccessTokenAttribute[passportId].winChances -= dec;
}
// view values
function getWinChances(uint256 tokenId)external view returns (uint32) {
//return the win chances of a specific token
return nftAccessTokenAttribute[tokenId].winChances;
}
//Soft Clay functions
// all the functions relating to the meteor dust process.
function increaseSoftClay(uint passportId, uint32 amount)external onlyRole(CONTRACT_ROLE){
nftAccessTokenAttribute[passportId].softClay += amount;
}
function decreaseSoftClay(uint passportId, uint32 amount)external onlyRole(CONTRACT_ROLE){
nftAccessTokenAttribute[passportId].softClay -= amount;
}
function updateRank(uint256 tokenId, uint32 _pioneerLevel, uint32 _legendLevel)external onlyRole(CONTRACT_ROLE){
// checks if the stamp count for a token id is high enough to move up a rank.
// we run it each time a stamp is claimed
if (nftAccessTokenAttribute[tokenId].softClay >= _legendLevel) {
nftAccessTokenAttribute[tokenId].rank = "Legend";
if (bytes(ImageContract.getIPFSImageForElement(elements[0],3)).length>0) {
//we have a legend image to update it to.
nftAccessTokenAttribute[tokenId].image = ImageContract.getIPFSImageForElement(nftAccessTokenAttribute[tokenId].element, 3);
nftAccessTokenAttribute[tokenId].cdnImage = ImageContract.getCDNImageForElement(nftAccessTokenAttribute[tokenId].element, 3);
}
} else if (
nftAccessTokenAttribute[tokenId].softClay >= _pioneerLevel &&
nftAccessTokenAttribute[tokenId].softClay < _legendLevel
) {
nftAccessTokenAttribute[tokenId].rank = "Pioneer";
if (bytes(ImageContract.getIPFSImageForElement(elements[0],2)).length > 0) {
//we have a legen image to update it to.
nftAccessTokenAttribute[tokenId].image = ImageContract.getIPFSImageForElement(nftAccessTokenAttribute[tokenId].element, 2);
nftAccessTokenAttribute[tokenId].cdnImage = ImageContract.getCDNImageForElement(nftAccessTokenAttribute[tokenId].element, 2);
}
} else if (nftAccessTokenAttribute[tokenId].softClay < _pioneerLevel) {
nftAccessTokenAttribute[tokenId].rank = "Navigator";
nftAccessTokenAttribute[tokenId].image = ImageContract.getIPFSImageForElement(nftAccessTokenAttribute[tokenId].element, 1);
nftAccessTokenAttribute[tokenId].cdnImage = ImageContract.getCDNImageForElement(nftAccessTokenAttribute[tokenId].element, 1);
}
}
function getSoftClay(uint passportId)external view onlyRole(CONTRACT_ROLE) returns(uint32){
return nftAccessTokenAttribute[passportId].softClay;
}
//Admin or Helper Functions
// Mostly the ones use internaly to help user flow on the site.
function setFreeMinters(address[] calldata winners)external onlyRole(UPDATER_ROLE){
// used by us to add competition winners
// should not exceed 500 items but can be split of required
for (uint16 i; i<winners.length;i++){
_freeMintable[winners[i]]+=1;
}
}
function setPrice(uint256 price) external onlyRole(UPDATER_ROLE) {
//set the price of minting.
_navPrice = price;
}
function setMaxAllowed(uint16 maxA)external onlyRole(UPDATER_ROLE){
//max allowed per wallet
_maxAllowedPerWallet = maxA;
}
function checkIfHasNFT(address owner)
external
view
returns (AccessToken[] memory nft)
{
//a solution to get ownership detials
uint256 bal = balanceOf(owner);
AccessToken[] memory x = new AccessToken[](bal);
for (uint256 i = 0; i < bal; i++) {
uint tokenId = tokenOfOwnerByIndex(owner,i);
x[i] = nftAccessTokenAttribute[tokenId];
}
return x;
}
function getCurrentTokenId() external view returns (string memory) {
// we will use this in the snapshot before each drop
// The idea being to loop through all the token id's from 1 up to this number and see who owns them,
// reading each token URI to see the win chances.
// we will do this on the front end.
return Strings.toString(_tokenIds.current());
}
function setMintLimit(uint32 limt) public onlyRole(UPDATER_ROLE) {
//change the mint limit to restrict the total number of NFT's that can be minted
_mintLimit = limt;
}
function sectionOne(uint _tokenId)external view returns(bytes memory){
bytes memory dataURI = abi.encodePacked(
'{"name": "',
nftAccessTokenAttribute[_tokenId].name, ": ", nftAccessTokenAttribute[_tokenId].element,
'", "description": "',
nftAccessTokenAttribute[_tokenId].description,
'", "image": "',
nftAccessTokenAttribute[_tokenId].image,
'", "animation_url": "',
nftAccessTokenAttribute[_tokenId].animation,
'", "attributes": [{ "trait_type": "Avatar WL", "value": "',
nftAccessTokenAttribute[_tokenId].avatarWl,
'"},{ "trait_type": "Rank", "value": "',
nftAccessTokenAttribute[_tokenId].rank,
'"},{ "trait_type": "Element", "value": "',
nftAccessTokenAttribute[_tokenId].element
);
return dataURI;
}
//token URI's
function tokenURI(uint256 _tokenId)
public
view
override
returns (string memory)
{
AccessToken memory accessTokenAttributes = nftAccessTokenAttribute[
_tokenId
];
return TuriContract.maketokenURi(_tokenId, accessTokenAttributes.whitelistSpots.length, accessTokenAttributes.winChances, accessTokenAttributes.softClay);
}
// Transfers the ETH out of the contract to the specified address.
function withdraw() external {
uint256 balance = address(this).balance;
Address.sendValue(_paymentSplit, balance);
}
}// 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(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
}
function log(uint p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
}
function log(uint p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
}
function log(uint p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
}
function log(string memory p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint)", 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, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", 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, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint)", 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(uint p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
}
function log(uint p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
}
function log(uint p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
}
function log(uint p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
}
function log(uint p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
}
function log(uint p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
}
function log(uint p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
}
function log(uint p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
}
function log(uint p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
}
function log(uint p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
}
function log(uint p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
}
function log(uint p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
}
function log(uint p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
}
function log(uint p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
}
function log(uint p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
}
function log(uint p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
}
function log(string memory p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
}
function log(string memory p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
}
function log(string memory p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
}
function log(string memory p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", 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, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
}
function log(bool p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
}
function log(bool p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
}
function log(bool p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", 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, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
}
function log(address p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
}
function log(address p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
}
function log(address p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", 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, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", 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(uint p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", 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, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", 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, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", 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));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "./IERC721Enumerable.sol";
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}// 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 (last updated v4.6.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(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 virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
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 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}// 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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
// Loads the table into memory
string memory table = _TABLE;
// Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
// and split into 4 numbers of 6 bits.
// The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
// - `data.length + 2` -> Round up
// - `/ 3` -> Number of 3-bytes chunks
// - `4 *` -> 4 characters for each chunk
string memory result = new string(4 * ((data.length + 2) / 3));
assembly {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 32)
// Run over the input, 3 bytes at a time
for {
let dataPtr := data
let endPtr := add(data, mload(data))
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 bytes (18 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F which is the number of
// the previous character in the ASCII table prior to the Base64 Table
// The result is then added to the table to get the character to write,
// and finally write it in the result pointer but with a left shift
// of 256 (1 byte) - 8 (1 ASCII char) = 248 bits
mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
resultPtr := add(resultPtr, 1) // Advance
}
// When data `bytes` is not exactly 3 bytes long
// it is padded with `=` characters at the end
switch mod(mload(data), 3)
case 1 {
mstore8(sub(resultPtr, 1), 0x3d)
mstore8(sub(resultPtr, 2), 0x3d)
}
case 2 {
mstore8(sub(resultPtr, 1), 0x3d)
}
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts 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 (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}// 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;
}{
"optimizer": {
"enabled": true,
"runs": 12
},
"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":"address","name":"imageContract","type":"address"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxAllowedPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_navPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlId","type":"uint256"},{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"attachWLSpot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberOfMints","type":"uint16"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"referrerTokenId","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bulkMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"checkAvatarWL","outputs":[{"internalType":"string","name":"av","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"checkIfHasNFT","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint32","name":"winChances","type":"uint32"},{"internalType":"uint32","name":"softClay","type":"uint32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"rank","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"string","name":"animation","type":"string"},{"internalType":"string","name":"cdnImage","type":"string"},{"internalType":"string","name":"element","type":"string"},{"internalType":"string","name":"avatarWl","type":"string"},{"internalType":"uint256[]","name":"whitelistSpots","type":"uint256[]"}],"internalType":"struct MetropolisWorldPassport.AccessToken[]","name":"nft","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"contractRemoveAvatarWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"decreaseSoftClay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint16","name":"dec","type":"uint16"}],"name":"decreaseWinChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"detachCityWLSpot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWallet","type":"address"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"getSoftClay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"}],"name":"getWLSpots","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWinChances","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"increaseSoftClay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"uint16","name":"inc","type":"uint16"}],"name":"increaseWinChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"avatar","type":"string"}],"name":"manualAddAvatarWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myFreeMints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"sectionOne","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"odd","type":"string"},{"internalType":"string","name":"even","type":"string"}],"name":"setAvatarWLNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"setFreeMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"imageContract","type":"address"}],"name":"setImageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxA","type":"uint16"}],"name":"setMaxAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"limt","type":"uint32"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"paymentContract","type":"address"},{"internalType":"address","name":"winContract","type":"address"},{"internalType":"address","name":"wlContract","type":"address"},{"internalType":"address","name":"turiContract","type":"address"}],"name":"setWLContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint32","name":"_pioneerLevel","type":"uint32"},{"internalType":"uint32","name":"_legendLevel","type":"uint32"}],"name":"updateRank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"mints","type":"uint16"}],"name":"userFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passportId","type":"uint256"},{"internalType":"string","name":"city","type":"string"},{"internalType":"uint32","name":"buildingId","type":"uint32"}],"name":"userUpdateAfterLoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6015805465ffffffffffff191665012d0000138817905560c060405260056080819052641b9bdb585960da1b60a09081526200003f9160169190620003a2565b506040805180820190915260078082526631b4ba34bd32b760c91b60209092019182526200007091601791620003a2565b506701aa535d3d0c00006018556040805161010081018252600460c08201908152634669726560e01b60e08301528152815180830183526005808252642bb0ba32b960d91b6020838101919091528084019290925283518085018552600381526220b4b960e91b81840152838501528351808501855281815264537061636560d81b8184015260608401528351808501855281815264141a5e195b60da1b818401526080840152835180850190945283526408ac2e4e8d60db1b9083015260a08101919091526200014690601990600662000431565b503480156200015457600080fd5b50604051620065ac380380620065ac833981016040819052620001779162000528565b604080518082018252601981527f4d6574726f706f6c697320576f726c642050617373706f7274000000000000006020808301918252835180850190945260058452644d4554574160d81b908401528151919291620001d991600091620003a2565b508051620001ef906001906020840190620003a2565b5050506200020c620002066200029e60201b60201c565b620002a2565b600c80546001600160a01b03199081166001600160a01b038516908117909255600d80549091169091179055620002506014620002f4602090811b6200320d17901c565b6200025d600082620002fd565b620002897f73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab33620002fd565b62000296600033620002fd565b50506200059c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff166200039e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200035d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b828054620003b0906200055f565b90600052602060002090601f016020900481019282620003d457600085556200041f565b82601f10620003ef57805160ff19168380011785556200041f565b828001600101855582156200041f579182015b828111156200041f57825182559160200191906001019062000402565b506200042d92915062000491565b5090565b82805482825590600052602060002090810192821562000483579160200282015b8281111562000483578251805162000472918491602090910190620003a2565b509160200191906001019062000452565b506200042d929150620004a8565b5b808211156200042d576000815560010162000492565b808211156200042d576000620004bf8282620004c9565b50600101620004a8565b508054620004d7906200055f565b6000825580601f10620004e8575050565b601f01602090049060005260206000209081019062000508919062000491565b50565b80516001600160a01b03811681146200052357600080fd5b919050565b600080604083850312156200053b578182fd5b62000546836200050b565b915062000556602084016200050b565b90509250929050565b600181811c908216806200057457607f821691505b602082108114156200059657634e487b7160e01b600052602260045260246000fd5b50919050565b61600080620005ac6000396000f3fe6080604052600436106102b75760003560e01c80636352211e1161016c5780636352211e146106bc578063644f1ea9146106dc57806367ad1a9b146107095780636e00af341461073657806370a082311461076b578063715018a61461078b5780637d53e615146107a05780637f9a105c146107c657806387a0fcd2146107e65780638da5cb5b1461080657806390de88331461081b57806391b7f5ed1461083b57806391d148541461085b57806395d89b411461087b578063a217fddf14610890578063a22cb465146108a5578063b1738035146108c5578063b360f4b0146108e5578063b88d4fde14610905578063c6f414a814610925578063c87b56dd1461093b578063d547741f1461095b578063db8d60501461097b578063df69124b1461099b578063e8a3d485146109bb578063e985e9c5146109d0578063f1cf6409146109f0578063f2fde38b14610a0d578063f687c3ce14610a2d578063fa07ce1d14610a4d57600080fd5b806301ffc9a7146102bc57806303fe46ab146102f157806306fdde031461032157806307b260ab14610343578063081812fc14610363578063095ea7b31461039b57806316c85277146103bd57806318160ddd146103dd5780631af5bf69146103f2578063201b1a651461041257806323b872dd14610432578063248a9ca314610452578063281ca2fc1461047257806329591a6f146104925780632f2ff15d146104b25780632f745c59146104d257806335672ef8146104f257806336568abe146105055780633870889f146105255780633ccfd60b1461054557806342842e0e1461055a57806347e633801461057a5780634886dbf11461059c5780634a3895d6146105bc5780634f6ccce7146106075780634ffcefd314610627578063538d9f5a1461064757806356189236146106675780635c103fd21461067c578063621c1f941461069c575b600080fd5b3480156102c857600080fd5b506102dc6102d7366004615123565b610a6d565b60405190151581526020015b60405180910390f35b3480156102fd57600080fd5b50610313600080516020615fab83398151915281565b6040519081526020016102e8565b34801561032d57600080fd5b50610336610a7e565b6040516102e89190615972565b34801561034f57600080fd5b5061033661035e3660046150e7565b610b10565b34801561036f57600080fd5b5061038361037e3660046150e7565b610bb5565b6040516001600160a01b0390911681526020016102e8565b3480156103a757600080fd5b506103bb6103b636600461504d565b610c42565b005b3480156103c957600080fd5b506103bb6103d8366004615078565b610d53565b3480156103e957600080fd5b50600854610313565b3480156103fe57600080fd5b506103bb61040d366004615329565b610e1b565b34801561041e57600080fd5b506103bb61042d366004615235565b610f09565b34801561043e57600080fd5b506103bb61044d366004614f73565b610f44565b34801561045e57600080fd5b5061031361046d3660046150e7565b610f75565b34801561047e57600080fd5b506103bb61048d366004615235565b610f8a565b34801561049e57600080fd5b506103bb6104ad3660046150ff565b61105f565b3480156104be57600080fd5b506103bb6104cd3660046150ff565b61111d565b3480156104de57600080fd5b506103136104ed36600461504d565b611139565b6103bb61050036600461526d565b6111cf565b34801561051157600080fd5b506103bb6105203660046150ff565b6114e8565b34801561053157600080fd5b506103bb6105403660046153f4565b611562565b34801561055157600080fd5b506103bb611c78565b34801561056657600080fd5b506103bb610575366004614f73565b611c93565b34801561058657600080fd5b50610313600080516020615f6b83398151915281565b3480156105a857600080fd5b506103bb6105b73660046153a8565b611cae565b3480156105c857600080fd5b506105f26105d73660046150e7565b6000908152601a602052604090206001015463ffffffff1690565b60405163ffffffff90911681526020016102e8565b34801561061357600080fd5b506103136106223660046150e7565b611d9f565b34801561063357600080fd5b506103bb610642366004614ee0565b611e40565b34801561065357600080fd5b506103bb6106623660046153a8565b611ec1565b34801561067357600080fd5b50610336611efe565b34801561068857600080fd5b506105f26106973660046150e7565b611f16565b3480156106a857600080fd5b506103bb6106b7366004615384565b611f58565b3480156106c857600080fd5b506103836106d73660046150e7565b611fbe565b3480156106e857600080fd5b506106fc6106f7366004614ec4565b612035565b6040516102e891906157eb565b34801561071557600080fd5b506107296107243660046150e7565b6126a4565b6040516102e8919061595f565b34801561074257600080fd5b5060155461075890600160201b900461ffff1681565b60405161ffff90911681526020016102e8565b34801561077757600080fd5b50610313610786366004614ec4565b612708565b34801561079757600080fd5b506103bb61278f565b3480156107ac57600080fd5b50336000908152601b602052604090205461ffff16610758565b3480156107d257600080fd5b506103bb6107e1366004614ec4565b6127ca565b3480156107f257600080fd5b506103bb610801366004615384565b612822565b34801561081257600080fd5b50610383612865565b34801561082757600080fd5b506103bb61083636600461542f565b612874565b34801561084757600080fd5b506103bb6108563660046150e7565b6128a9565b34801561086757600080fd5b506102dc6108763660046150ff565b6128c7565b34801561088757600080fd5b506103366128f2565b34801561089c57600080fd5b50610313600081565b3480156108b157600080fd5b506103bb6108c036600461501c565b612901565b3480156108d157600080fd5b506103366108e03660046150e7565b61290c565b3480156108f157600080fd5b506103bb6109003660046152e0565b612968565b34801561091157600080fd5b506103bb610920366004614fb3565b61299c565b34801561093157600080fd5b5061031360185481565b34801561094757600080fd5b506103366109563660046150e7565b6129ce565b34801561096757600080fd5b506103bb6109763660046150ff565b612fb7565b34801561098757600080fd5b506103bb6109963660046153c9565b612fd3565b3480156109a757600080fd5b506103bb6109b636600461515b565b61301c565b3480156109c757600080fd5b50610336613055565b3480156109dc57600080fd5b506102dc6109eb366004614f3b565b6130d6565b3480156109fc57600080fd5b506015546105f29063ffffffff1681565b348015610a1957600080fd5b506103bb610a28366004614ec4565b613104565b348015610a3957600080fd5b506103bb610a483660046153c9565b6131a1565b348015610a5957600080fd5b506103bb610a68366004614ec4565b6131ea565b6000610a7882613216565b92915050565b606060008054610a8d90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab990615c91565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000818152601a60205260409020600901805460609190610b3090615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90615c91565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b50505050509050919050565b6000610bc08261323b565b610c265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c4d82611fbe565b9050806001600160a01b0316836001600160a01b03161415610cbb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c1d565b336001600160a01b0382161480610cd75750610cd781336130d6565b610d445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c1d565b610d4e8383613258565b505050565b600080516020615f6b833981519152610d6b816132c6565b60005b61ffff8116831115610e15576001601b600086868561ffff16818110610da457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610db99190614ec4565b6001600160a01b03168152602081019190915260400160009081208054909190610de890849061ffff16615b67565b92506101000a81548161ffff021916908361ffff1602179055508080610e0d90615cc6565b915050610d6e565b50505050565b33610e2585611fbe565b6001600160a01b031614610e9b5760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374206f776e207468652070617373706f727420746f20636c61604482015276696d2077696e206368616e636520696e6372656173657360481b6064820152608401610c1d565b600f54604051634af2407160e01b81526001600160a01b0390911690634af2407190610ed1908790879087908790600401615acb565b600060405180830381600087803b158015610eeb57600080fd5b505af1158015610eff573d6000803e3d6000fd5b5050505050505050565b600080516020615f6b833981519152610f21816132c6565b506015805461ffff909216600160201b0261ffff60201b19909216919091179055565b610f4e33826132d0565b610f6a5760405162461bcd60e51b8152600401610c1d90615a7a565b610d4e83838361339a565b6000908152600b602052604090206001015490565b336000908152601b602052604090205461ffff80831691161015610fec5760405162461bcd60e51b81526020600482015260196024820152781b9bdd081bdb881d1a1948199c9959481b5a5b9d081b1a5cdd603a1b6044820152606401610c1d565b60005b8161ffff168161ffff16101561105b5761100a33600261352f565b336000908152601b6020526040812080546001929061102e90849061ffff16615bf7565b92506101000a81548161ffff021916908361ffff160217905550808061105390615cc6565b915050610fef565b5050565b600080516020615fab833981519152611077816132c6565b816001600160a01b031661108a84611fbe565b6001600160a01b0316146110e05760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206e6565647320746f206f776e207468652070617373706f7274006044820152606401610c1d565b60408051808201825260048152636e6f6e6560e01b60208083019182526000878152601a909152929092209051610e159260099092019190614cd4565b61112682610f75565b61112f816132c6565b610d4e8383613b9f565b600061114483612708565b82106111a65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c1d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6111d7612865565b6001600160a01b03166111ea8383613c25565b6001600160a01b0316146112345760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606401610c1d565b601c816040516112449190615595565b9081526040519081900360200190205460ff16156112a45760405162461bcd60e51b815260206004820181905260248201527f5369676e61747572652068617320616c7265616479206265656e20757365642e6044820152606401610c1d565b60155461ffff600160201b90910481169086161061131c5760405162461bcd60e51b815260206004820152602f60248201527f547279696e6720746f206d696e74206d6f7265207468656e206d617820616c6c60448201526e1bddd959081c195c881dd85b1b195d608a1b6064820152608401610c1d565b60185461132d9061ffff8716615bd8565b34101561136e5760405162461bcd60e51b815260206004820152600f60248201526e0dcdee840e0c2d2c840cadcdeeaced608b1b6044820152606401610c1d565b601554611387908690600160201b900461ffff16615bf7565b61ffff1661139433612708565b106113b15760405162461bcd60e51b8152600401610c1d90615a10565b60155463ffffffff16600161ffff87166113ca60145490565b6113d49190615b8d565b6113de9190615c1a565b111561142c5760405162461bcd60e51b815260206004820152601d60248201527f57696c6c2074616b6520796f75206f766572206d617820737570706c790000006044820152606401610c1d565b6001601c8260405161143e9190615595565b908152604051908190036020019020805491151560ff1990921691909117905560005b8561ffff168161ffff1610156114a3578315611486576114818486613c7e565b611491565b61149185600161352f565b8061149b81615cc6565b915050611461565b506018546114b59061ffff8716615bd8565b3411156114e1576114e1336018548761ffff166114d29190615bd8565b6114dc9034615c1a565b613d8d565b5050505050565b6001600160a01b03811633146115585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610c1d565b61105b8282613ea3565b600080516020615fab83398151915261157a816132c6565b6000848152601a602052604090206001015463ffffffff808416600160201b909204161061182a576040805180820182526006815265131959d95b9960d21b60208083019182526000888152601a9091529290922090516115e19260039092019190614cd4565b50600d54601980546000926001600160a01b03169163aa158c3891849061161857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160036040518363ffffffff1660e01b81526004016116419291906159ab565b60006040518083038186803b15801561165957600080fd5b505afa15801561166d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261169591908101906151c3565b51111561182557600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c38916116e2916008909101906003906004016159ab565b60006040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261173691908101906151c3565b601a6000868152602001908152602001600020600501908051906020019061175f929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a849425916117a6916008909101906003906004016159ab565b60006040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117fa91908101906151c3565b601a60008681526020019081526020016000206007019080519060200190611823929190614cd4565b505b610e15565b6000848152601a602052604090206001015463ffffffff808516600160201b909204161080159061187b57506000848152601a602052604090206001015463ffffffff808416600160201b90920416105b15611a855760408051808201825260078152662834b7b732b2b960c91b60208083019182526000888152601a9091529290922090516118c09260039092019190614cd4565b50600d54601980546000926001600160a01b03169163aa158c389184906118f757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160026040518363ffffffff1660e01b81526004016119209291906159ab565b60006040518083038186803b15801561193857600080fd5b505afa15801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261197491908101906151c3565b51111561182557600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c38916119c1916008909101906002906004016159ab565b60006040518083038186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a1591908101906151c3565b601a60008681526020019081526020016000206005019080519060200190611a3e929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a849425916117a6916008909101906002906004016159ab565b6000848152601a602052604090206001015463ffffffff808516600160201b909204161015610e155760408051808201825260098152682730bb34b3b0ba37b960b91b60208083019182526000888152601a909152929092209051611af09260039092019190614cd4565b50600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c3891611b37916008909101906001906004016159ab565b60006040518083038186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b8b91908101906151c3565b601a60008681526020019081526020016000206005019080519060200190611bb4929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a84942591611bfb916008909101906001906004016159ab565b60006040518083038186803b158015611c1357600080fd5b505afa158015611c27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c4f91908101906151c3565b601a600086815260200190815260200160002060070190805190602001906114e1929190614cd4565b6013544790611c90906001600160a01b031682613d8d565b50565b610d4e8383836040518060200160405280600081525061299c565b600080516020615fab833981519152611cc6816132c6565b6000838152601a60205260409020600a018054611ce590600190615c1a565b81548110611d0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601a6000858152602001908152602001600020600a018381548110611d4357634e487b7160e01b600052603260045260246000fd5b9060005260206000200181905550601a6000848152602001908152602001600020600a01805480611d8457634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055505050565b6000611daa60085490565b8210611e0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c1d565b60088281548110611e2e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600080516020615f6b833981519152611e58816132c6565b50600e80546001600160a01b039485166001600160a01b03199182168117909255600f8054821690921790915560108054938516938216939093179092556011805491841691831682179055601280548316909117905560138054939092169216919091179055565b600080516020615fab833981519152611ed9816132c6565b506000908152601a602090815260408220600a01805460018101825590835291200155565b6060611f11611f0c60145490565b613f0a565b905090565b6000600080516020615fab833981519152611f30816132c6565b6000838152601a6020526040902060010154600160201b900463ffffffff1691505b50919050565b600080516020615fab833981519152611f70816132c6565b6000838152601a60205260408120600101805461ffff85169290611f9b90849063ffffffff16615ba5565b92506101000a81548163ffffffff021916908363ffffffff160217905550505050565b6000818152600260205260408120546001600160a01b031680610a785760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c1d565b6060600061204283612708565b90506000816001600160401b0381111561206c57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561210d57816020015b6120fa60405180610180016040528060008152602001600063ffffffff168152602001600063ffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161208a5790505b50905060005b8281101561269c5760006121278683611139565b6000818152601a602090815260409182902082516101808101845281548152600182015463ffffffff80821694830194909452600160201b900490921692820192909252600282018054939450909260608401919061218590615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546121b190615c91565b80156121fe5780601f106121d3576101008083540402835291602001916121fe565b820191906000526020600020905b8154815290600101906020018083116121e157829003601f168201915b5050505050815260200160038201805461221790615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461224390615c91565b80156122905780601f1061226557610100808354040283529160200191612290565b820191906000526020600020905b81548152906001019060200180831161227357829003601f168201915b505050505081526020016004820180546122a990615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546122d590615c91565b80156123225780601f106122f757610100808354040283529160200191612322565b820191906000526020600020905b81548152906001019060200180831161230557829003601f168201915b5050505050815260200160058201805461233b90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461236790615c91565b80156123b45780601f10612389576101008083540402835291602001916123b4565b820191906000526020600020905b81548152906001019060200180831161239757829003601f168201915b505050505081526020016006820180546123cd90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546123f990615c91565b80156124465780601f1061241b57610100808354040283529160200191612446565b820191906000526020600020905b81548152906001019060200180831161242957829003601f168201915b5050505050815260200160078201805461245f90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461248b90615c91565b80156124d85780601f106124ad576101008083540402835291602001916124d8565b820191906000526020600020905b8154815290600101906020018083116124bb57829003601f168201915b505050505081526020016008820180546124f190615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461251d90615c91565b801561256a5780601f1061253f5761010080835404028352916020019161256a565b820191906000526020600020905b81548152906001019060200180831161254d57829003601f168201915b5050505050815260200160098201805461258390615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546125af90615c91565b80156125fc5780601f106125d1576101008083540402835291602001916125fc565b820191906000526020600020905b8154815290600101906020018083116125df57829003601f168201915b50505050508152602001600a820180548060200260200160405190810160405280929190818152602001828054801561265457602002820191906000526020600020905b815481526020019060010190808311612640575b50505050508152505083838151811061267d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525050808061269490615ce8565b915050612113565b509392505050565b6000818152601a6020908152604091829020600a01805483518184028101840190945280845260609392830182828015610ba957602002820191906000526020600020905b8154815260200190600101908083116126e95750505050509050919050565b60006001600160a01b0382166127735760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c1d565b506001600160a01b031660009081526003602052604090205490565b33612798612865565b6001600160a01b0316146127be5760405162461bcd60e51b8152600401610c1d90615a45565b6127c86000614023565b565b600080516020615f6b8339815191526127e2816132c6565b6001600160a01b0382166127f557600080fd5b50600c80546001600160a01b039092166001600160a01b03199283168117909155600d8054909216179055565b600080516020615fab83398151915261283a816132c6565b6000838152601a60205260408120600101805461ffff85169290611f9b90849063ffffffff16615c31565b600a546001600160a01b031690565b600080516020615f6b83398151915261288c816132c6565b506015805463ffffffff191663ffffffff92909216919091179055565b600080516020615f6b8339815191526128c1816132c6565b50601855565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610a8d90615c91565b61105b338383614075565b6000818152601a6020908152604080832090516060939261295192600281019260088201926004830192600581019260068201926009830192600301918791016155b1565b60408051601f198184030181529190529392505050565b600080516020615f6b833981519152612980816132c6565b6000848152601a602052604090206114e1906009018484614d58565b6129a633836132d0565b6129c25760405162461bcd60e51b8152600401610c1d90615a7a565b610e1584848484614140565b6000818152601a6020908152604080832081516101808101835281548152600182015463ffffffff80821695830195909552600160201b90049093169183019190915260028101805460609493929183860191612a2a90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5690615c91565b8015612aa35780601f10612a7857610100808354040283529160200191612aa3565b820191906000526020600020905b815481529060010190602001808311612a8657829003601f168201915b50505050508152602001600382018054612abc90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612ae890615c91565b8015612b355780601f10612b0a57610100808354040283529160200191612b35565b820191906000526020600020905b815481529060010190602001808311612b1857829003601f168201915b50505050508152602001600482018054612b4e90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612b7a90615c91565b8015612bc75780601f10612b9c57610100808354040283529160200191612bc7565b820191906000526020600020905b815481529060010190602001808311612baa57829003601f168201915b50505050508152602001600582018054612be090615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0c90615c91565b8015612c595780601f10612c2e57610100808354040283529160200191612c59565b820191906000526020600020905b815481529060010190602001808311612c3c57829003601f168201915b50505050508152602001600682018054612c7290615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9e90615c91565b8015612ceb5780601f10612cc057610100808354040283529160200191612ceb565b820191906000526020600020905b815481529060010190602001808311612cce57829003601f168201915b50505050508152602001600782018054612d0490615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3090615c91565b8015612d7d5780601f10612d5257610100808354040283529160200191612d7d565b820191906000526020600020905b815481529060010190602001808311612d6057829003601f168201915b50505050508152602001600882018054612d9690615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc290615c91565b8015612e0f5780601f10612de457610100808354040283529160200191612e0f565b820191906000526020600020905b815481529060010190602001808311612df257829003601f168201915b50505050508152602001600982018054612e2890615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5490615c91565b8015612ea15780601f10612e7657610100808354040283529160200191612ea1565b820191906000526020600020905b815481529060010190602001808311612e8457829003601f168201915b50505050508152602001600a8201805480602002602001604051908101604052809291908181526020018280548015612ef957602002820191906000526020600020905b815481526020019060010190808311612ee5575b5050509190925250506012546101608301515160208401516040808601519051632acabed360e01b8152600481018a9052602481019390935263ffffffff91821660448401521660648201529293506001600160a01b031691632acabed3915060840160006040518083038186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fb091908101906151c3565b9392505050565b612fc082610f75565b612fc9816132c6565b610d4e8383613ea3565b600080516020615fab833981519152612feb816132c6565b6000838152601a602052604090206001018054839190600490611f9b908490600160201b900463ffffffff16615ba5565b600080516020615f6b833981519152613034816132c6565b61304060168686614d58565b5061304d60178484614d58565b505050505050565b6012546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d485916004808301926000929190829003018186803b15801561309a57600080fd5b505afa1580156130ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f1191908101906151c3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361310d612865565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610c1d90615a45565b6001600160a01b0381166131985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b611c9081614023565b600080516020615fab8339815191526131b9816132c6565b6000838152601a602052604090206001018054839190600490611f9b908490600160201b900463ffffffff16615c31565b600080516020615f6b833981519152613202816132c6565b61105b82600161352f565b80546001019055565b60006001600160e01b03198216637965db0b60e01b1480610a785750610a7882614173565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061328d82611fbe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c908133614198565b60006132db8261323b565b61333c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c1d565b600061334783611fbe565b9050806001600160a01b0316846001600160a01b0316148061336e575061336e81856130d6565b806133925750836001600160a01b031661338784610bb5565b6001600160a01b0316145b949350505050565b826001600160a01b03166133ad82611fbe565b6001600160a01b0316146134115760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c1d565b6001600160a01b0382166134735760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c1d565b61347e8383836141fc565b613489600082613258565b6001600160a01b03831660009081526003602052604081208054600192906134b2908490615c1a565b90915550506001600160a01b03821660009081526003602052604081208054600192906134e0908490615b8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615f8b83398151915291a4505050565b600061353a60145490565b60155490915063ffffffff168111156135865760405162461bcd60e51b815260206004820152600e60248201526d151bc81b585b9e481b5a5b9d195960921b6044820152606401610c1d565b601554600160201b900461ffff1661359d84612708565b106135ba5760405162461bcd60e51b8152600401610c1d90615a10565b600060196135c9600684615d03565b815481106135e757634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546135fc90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461362890615c91565b80156136755780601f1061364a57610100808354040283529160200191613675565b820191906000526020600020905b81548152906001019060200180831161365857829003601f168201915b5050505050905060006016805461368b90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546136b790615c91565b80156137045780601f106136d957610100808354040283529160200191613704565b820191906000526020600020905b8154815290600101906020018083116136e757829003601f168201915b505050505090506002836137189190615d03565b600114156137ae576017805461372d90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461375990615c91565b80156137a65780601f1061377b576101008083540402835291602001916137a6565b820191906000526020600020905b81548152906001019060200180831161378957829003601f168201915b505050505090505b6137b88584614207565b6040518061018001604052808481526020018563ffffffff168152602001600063ffffffff1681526020016040518060400160405280601981526020017813595d1c9bdc1bdb1a5cc815dbdc9b190814185cdcdc1bdc9d603a1b8152508152602001604051806040016040528060098152602001682730bb34b3b0ba37b960b91b81525081526020016040518061020001604052806101d68152602001615d956101d691398152600d54604051631542b18760e31b81526020909201916001600160a01b039091169063aa158c3890613898908790600190600401615985565b60006040518083038186803b1580156138b057600080fd5b505afa1580156138c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138ec91908101906151c3565b8152600d546040516385c496ad60e01b81526020909201916001600160a01b03909116906385c496ad90613924908790600401615972565b60006040518083038186803b15801561393c57600080fd5b505afa158015613950573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261397891908101906151c3565b8152600d54604051631a84942560e01b81526020909201916001600160a01b0390911690631a849425906139b3908790600190600401615985565b60006040518083038186803b1580156139cb57600080fd5b505afa1580156139df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a0791908101906151c3565b815260208101849052604081018390526060016000604051908082528060200260200182016040528015613a45578160200160208202803683370190505b5090526000848152601a602090815260409182902083518155838201516001820180549486015163ffffffff908116600160201b026001600160401b03199096169216919091179390931790925560608301518051613aaa9260028501920190614cd4565b5060808201518051613ac6916003840191602090910190614cd4565b5060a08201518051613ae2916004840191602090910190614cd4565b5060c08201518051613afe916005840191602090910190614cd4565b5060e08201518051613b1a916006840191602090910190614cd4565b506101008201518051613b37916007840191602090910190614cd4565b506101208201518051613b54916008840191602090910190614cd4565b506101408201518051613b71916009840191602090910190614cd4565b506101608201518051613b8e91600a840191602090910190614dcc565b5050601480546001019055506114e1565b613ba982826128c7565b61105b576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613be13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6020820152603c81018390526000908190605c016040516020818303038152906040528051906020012090506133928184614221565b6000613c8960145490565b9050808310613ccd5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c1d565b613cd882600261352f565b600f60009054906101000a90046001600160a01b03166001600160a01b031663139dbb6a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2657600080fd5b505afa158015613d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5e9190615251565b6000848152601a60205260408120600101805461ffff9390931692909190611f9b90849063ffffffff16615ba5565b80471015613ddd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e2a576040519150601f19603f3d011682016040523d82523d6000602084013e613e2f565b606091505b5050905080610d4e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b6064820152608401610c1d565b613ead82826128c7565b1561105b576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606081613f2e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613f585780613f4281615ce8565b9150613f519050600a83615bc4565b9150613f32565b6000816001600160401b03811115613f8057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613faa576020820181803683370190505b5090505b841561339257613fbf600183615c1a565b9150613fcc600a86615d03565b613fd7906030615b8d565b60f81b818381518110613ffa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061401c600a86615bc4565b9450613fae565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156140d35760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c1d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61414b84848461339a565b6141578484848461423d565b610e155760405162461bcd60e51b8152600401610c1d906159be565b60006001600160e01b0319821663780e9d6360e01b1480610a785750610a788261434a565b6141a282826128c7565b61105b576141ba816001600160a01b0316601461439a565b6141c583602061439a565b6040516020016141d692919061573f565b60408051601f198184030181529082905262461bcd60e51b8252610c1d91600401615972565b610d4e83838361457b565b61105b828260405180602001604052806000815250614633565b60008060006142308585614666565b9150915061269c816146d6565b60006001600160a01b0384163b1561433f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906142819033908990889088906004016157ae565b602060405180830381600087803b15801561429b57600080fd5b505af19250505080156142cb575060408051601f3d908101601f191682019092526142c89181019061513f565b60015b614325573d8080156142f9576040519150601f19603f3d011682016040523d82523d6000602084013e6142fe565b606091505b50805161431d5760405162461bcd60e51b8152600401610c1d906159be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613392565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061437b57506001600160e01b03198216635b5e139f60e01b145b80610a7857506301ffc9a760e01b6001600160e01b0319831614610a78565b606060006143a9836002615bd8565b6143b4906002615b8d565b6001600160401b038111156143d957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614403576020820181803683370190505b509050600360fc1b8160008151811061442c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061446957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061448d846002615bd8565b614498906001615b8d565b90505b600181111561452c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106144da57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106144fe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361452581615c7a565b905061449b565b508315612fb05760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610c1d565b6001600160a01b0383166145d6576145d181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6145f9565b816001600160a01b0316836001600160a01b0316146145f9576145f983826148d2565b6001600160a01b03821661461057610d4e8161496f565b826001600160a01b0316826001600160a01b031614610d4e57610d4e8282614a48565b61463d8383614a8c565b61464a600084848461423d565b610d4e5760405162461bcd60e51b8152600401610c1d906159be565b60008082516041141561469d5760208301516040840151606085015160001a61469187828585614bb8565b945094505050506146cf565b8251604014156146c757602083015160408401516146bc868383614c9b565b9350935050506146cf565b506000905060025b9250929050565b60008160048111156146f857634e487b7160e01b600052602160045260246000fd5b14156147015750565b600181600481111561472357634e487b7160e01b600052602160045260246000fd5b141561476c5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610c1d565b600281600481111561478e57634e487b7160e01b600052602160045260246000fd5b14156147dc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c1d565b60038160048111156147fe57634e487b7160e01b600052602160045260246000fd5b14156148575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c1d565b600481600481111561487957634e487b7160e01b600052602160045260246000fd5b1415611c905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c1d565b600060016148df84612708565b6148e99190615c1a565b60008381526007602052604090205490915080821461493c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061498190600190615c1a565b600083815260096020526040812054600880549394509092849081106149b757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106149e657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614a2c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614a5383612708565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216614ae25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c1d565b614aeb8161323b565b15614b375760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c1d565b614b43600083836141fc565b6001600160a01b0382166000908152600360205260408120805460019290614b6c908490615b8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615f8b833981519152908290a45050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115614be55750600090506003614c92565b8460ff16601b14158015614bfd57508460ff16601c14155b15614c0e5750600090506004614c92565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c62573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614c8b57600060019250925050614c92565b9150600090505b94509492505050565b6000806001600160ff1b03831681614cb860ff86901c601b615b8d565b9050614cc687828885614bb8565b935093505050935093915050565b828054614ce090615c91565b90600052602060002090601f016020900481019282614d025760008555614d48565b82601f10614d1b57805160ff1916838001178555614d48565b82800160010185558215614d48579182015b82811115614d48578251825591602001919060010190614d2d565b50614d54929150614e06565b5090565b828054614d6490615c91565b90600052602060002090601f016020900481019282614d865760008555614d48565b82601f10614d9f5782800160ff19823516178555614d48565b82800160010185558215614d48579182015b82811115614d48578235825591602001919060010190614db1565b828054828255906000526020600020908101928215614d485791602002820182811115614d48578251825591602001919060010190614d2d565b5b80821115614d545760008155600101614e07565b600082601f830112614e2b578081fd5b8135614e3e614e3982615b40565b615b10565b818152846020838601011115614e52578283fd5b816020850160208301379081016020019190915292915050565b60008083601f840112614e7d578182fd5b5081356001600160401b03811115614e93578182fd5b6020830191508360208285010111156146cf57600080fd5b803563ffffffff81168114614ebf57600080fd5b919050565b600060208284031215614ed5578081fd5b8135612fb081615d59565b60008060008060808587031215614ef5578283fd5b8435614f0081615d59565b93506020850135614f1081615d59565b92506040850135614f2081615d59565b91506060850135614f3081615d59565b939692955090935050565b60008060408385031215614f4d578182fd5b8235614f5881615d59565b91506020830135614f6881615d59565b809150509250929050565b600080600060608486031215614f87578283fd5b8335614f9281615d59565b92506020840135614fa281615d59565b929592945050506040919091013590565b60008060008060808587031215614fc8578384fd5b8435614fd381615d59565b93506020850135614fe381615d59565b92506040850135915060608501356001600160401b03811115615004578182fd5b61501087828801614e1b565b91505092959194509250565b6000806040838503121561502e578182fd5b823561503981615d59565b915060208301358015158114614f68578182fd5b6000806040838503121561505f578182fd5b823561506a81615d59565b946020939093013593505050565b6000806020838503121561508a578182fd5b82356001600160401b03808211156150a0578384fd5b818501915085601f8301126150b3578384fd5b8135818111156150c1578485fd5b8660208260051b85010111156150d5578485fd5b60209290920196919550909350505050565b6000602082840312156150f8578081fd5b5035919050565b60008060408385031215615111578182fd5b823591506020830135614f6881615d59565b600060208284031215615134578081fd5b8135612fb081615d6e565b600060208284031215615150578081fd5b8151612fb081615d6e565b60008060008060408587031215615170578182fd5b84356001600160401b0380821115615186578384fd5b61519288838901614e6c565b909650945060208701359150808211156151aa578384fd5b506151b787828801614e6c565b95989497509550505050565b6000602082840312156151d4578081fd5b81516001600160401b038111156151e9578182fd5b8201601f810184136151f9578182fd5b8051615207614e3982615b40565b81815285602083850101111561521b578384fd5b61522c826020830160208601615c4e565b95945050505050565b600060208284031215615246578081fd5b8135612fb081615d84565b600060208284031215615262578081fd5b8151612fb081615d84565b600080600080600060a08688031215615284578283fd5b853561528f81615d84565b9450602086013561529f81615d59565b9350604086013592506060860135915060808601356001600160401b038111156152c7578182fd5b6152d388828901614e1b565b9150509295509295909350565b6000806000604084860312156152f4578081fd5b8335925060208401356001600160401b03811115615310578182fd5b61531c86828701614e6c565b9497909650939450505050565b6000806000806060858703121561533e578182fd5b8435935060208501356001600160401b0381111561535a578283fd5b61536687828801614e6c565b9094509250615379905060408601614eab565b905092959194509250565b60008060408385031215615396578182fd5b823591506020830135614f6881615d84565b600080604083850312156153ba578182fd5b50508035926020909101359150565b600080604083850312156153db578182fd5b823591506153eb60208401614eab565b90509250929050565b600080600060608486031215615408578081fd5b8335925061541860208501614eab565b915061542660408501614eab565b90509250925092565b600060208284031215615440578081fd5b612fb082614eab565b6000815180845260208085019450808401835b838110156154785781518752958201959082019060010161545c565b509495945050505050565b6000815180845261549b816020860160208601615c4e565b601f01601f19169290920160200192915050565b600081546154bc81615c91565b8085526020600183811680156154d957600181146154ed5761551b565b60ff1985168884015260408801955061551b565b866000528260002060005b858110156155135781548a82018601529083019084016154f8565b890184019650505b505050505092915050565b6000815461553381615c91565b6001828116801561554b576001811461555c5761558b565b60ff1984168752828701945061558b565b8560005260208060002060005b858110156155825781548a820152908401908201615569565b50505082870194505b5050505092915050565b600082516155a7818460208701615c4e565b9190910192915050565b693d913730b6b2911d101160b11b815260006155d0600a83018b615526565b6101d160f51b81526155e5600282018b615526565b72111610113232b9b1b934b83a34b7b7111d101160691b8152905061560d601382018a615526565b6c1116101134b6b0b3b2911d101160991b8152905061562f600d820189615526565b741116101130b734b6b0ba34b7b72fbab936111d101160591b815290506156596015820188615526565b7f222c202261747472696275746573223a205b7b202274726169745f74797065228152781d101120bb30ba30b9102ba6111610113b30b63ab2911d101160391b602082015290506156ad6039820187615526565b7f227d2c7b202274726169745f74797065223a202252616e6b222c202276616c7581526432911d101160d91b602082015290506156ed6025820186615526565b7f227d2c7b202274726169745f74797065223a2022456c656d656e74222c20227681526730b63ab2911d101160c11b602082015290506157306028820185615526565b9b9a5050505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351615771816017850160208801615c4e565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516157a2816028840160208801615c4e565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906157e190830184615483565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561595157603f198984030185528151805184528781015163ffffffff90811689860152878201511687850152606080820151610180828701819052919061585e83880182615483565b92505050608080830151868303828801526158798382615483565b9250505060a080830151868303828801526158948382615483565b9250505060c080830151868303828801526158af8382615483565b9250505060e080830151868303828801526158ca8382615483565b9250505061010080830151868303828801526158e68382615483565b9250505061012080830151868303828801526159028382615483565b92505050610140808301518683038288015261591e8382615483565b92505050610160808301519250858203818701525061593d8183615449565b968901969450505090860190600101615811565b509098975050505050505050565b602081526000612fb06020830184615449565b602081526000612fb06020830184615483565b6040815260006159986040830185615483565b905061ffff831660208301529392505050565b60408152600061599860408301856154af565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f6164647265737320616c7265616479206f776e73206d617820616c6c6f776564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b8481526060602082015282606082015282846080830137600080608085840101526080601f19601f860116830101905063ffffffff8316604083015295945050505050565b604051601f8201601f191681016001600160401b0381118282101715615b3857615b38615d43565b604052919050565b60006001600160401b03821115615b5957615b59615d43565b50601f01601f191660200190565b600061ffff808316818516808303821115615b8457615b84615d17565b01949350505050565b60008219821115615ba057615ba0615d17565b500190565b600063ffffffff808316818516808303821115615b8457615b84615d17565b600082615bd357615bd3615d2d565b500490565b6000816000190483118215151615615bf257615bf2615d17565b500290565b600061ffff83811690831681811015615c1257615c12615d17565b039392505050565b600082821015615c2c57615c2c615d17565b500390565b600063ffffffff83811690831681811015615c1257615c12615d17565b60005b83811015615c69578181015183820152602001615c51565b83811115610e155750506000910152565b600081615c8957615c89615d17565b506000190190565b600181811c90821680615ca557607f821691505b60208210811415611f5257634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415615cde57615cde615d17565b6001019392505050565b6000600019821415615cfc57615cfc615d17565b5060010190565b600082615d1257615d12615d2d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611c9057600080fd5b6001600160e01b031981168114611c9057600080fd5b61ffff81168114611c9057600080fdfe546865204d6574726f706f6c697320576f726c642050617373706f72742070726f76696465732061636365737320746f20746865207661737420616e6420657665722d657870616e64696e6720776f726c64206f66204d6574726f706f6c69732e205769746820796f75722050617373706f72742c20796f752077696c6c2062652061626c6520746f20756e6c6f636b20796f75722067616d65722070726f66696c652c206861766520612067756172616e7465656420574c20666f72206f6e65206f66206f757220617661746172732c2061206368616e6365206174206f776e696e67206120756e69717565203178312070726f706572747920696e206f6e65206f66206f7572206369746965732c2061732077656c6c2061732061636365737320746f207370656369616c206576656e747320616e6420657870657269656e6365732e20417320796f7520696d6d6572736520796f757273656c662077697468696e204d6574726f706f6c697320576f726c6420796f75722050617373706f72742077696c6c2065766f6c76652c20676976696e6720796f75206120756e69717565206761746577617920696e746f20746865206361706974616c20636974696573206f6620746865204d65746176657273652e73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dabddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223ca2646970667358221220e07b61463a774c4ae0939e50174c68bdb996f149bea4ea8e2515160b15a0a78164736f6c63430008040033000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc4490000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
Deployed Bytecode
0x6080604052600436106102b75760003560e01c80636352211e1161016c5780636352211e146106bc578063644f1ea9146106dc57806367ad1a9b146107095780636e00af341461073657806370a082311461076b578063715018a61461078b5780637d53e615146107a05780637f9a105c146107c657806387a0fcd2146107e65780638da5cb5b1461080657806390de88331461081b57806391b7f5ed1461083b57806391d148541461085b57806395d89b411461087b578063a217fddf14610890578063a22cb465146108a5578063b1738035146108c5578063b360f4b0146108e5578063b88d4fde14610905578063c6f414a814610925578063c87b56dd1461093b578063d547741f1461095b578063db8d60501461097b578063df69124b1461099b578063e8a3d485146109bb578063e985e9c5146109d0578063f1cf6409146109f0578063f2fde38b14610a0d578063f687c3ce14610a2d578063fa07ce1d14610a4d57600080fd5b806301ffc9a7146102bc57806303fe46ab146102f157806306fdde031461032157806307b260ab14610343578063081812fc14610363578063095ea7b31461039b57806316c85277146103bd57806318160ddd146103dd5780631af5bf69146103f2578063201b1a651461041257806323b872dd14610432578063248a9ca314610452578063281ca2fc1461047257806329591a6f146104925780632f2ff15d146104b25780632f745c59146104d257806335672ef8146104f257806336568abe146105055780633870889f146105255780633ccfd60b1461054557806342842e0e1461055a57806347e633801461057a5780634886dbf11461059c5780634a3895d6146105bc5780634f6ccce7146106075780634ffcefd314610627578063538d9f5a1461064757806356189236146106675780635c103fd21461067c578063621c1f941461069c575b600080fd5b3480156102c857600080fd5b506102dc6102d7366004615123565b610a6d565b60405190151581526020015b60405180910390f35b3480156102fd57600080fd5b50610313600080516020615fab83398151915281565b6040519081526020016102e8565b34801561032d57600080fd5b50610336610a7e565b6040516102e89190615972565b34801561034f57600080fd5b5061033661035e3660046150e7565b610b10565b34801561036f57600080fd5b5061038361037e3660046150e7565b610bb5565b6040516001600160a01b0390911681526020016102e8565b3480156103a757600080fd5b506103bb6103b636600461504d565b610c42565b005b3480156103c957600080fd5b506103bb6103d8366004615078565b610d53565b3480156103e957600080fd5b50600854610313565b3480156103fe57600080fd5b506103bb61040d366004615329565b610e1b565b34801561041e57600080fd5b506103bb61042d366004615235565b610f09565b34801561043e57600080fd5b506103bb61044d366004614f73565b610f44565b34801561045e57600080fd5b5061031361046d3660046150e7565b610f75565b34801561047e57600080fd5b506103bb61048d366004615235565b610f8a565b34801561049e57600080fd5b506103bb6104ad3660046150ff565b61105f565b3480156104be57600080fd5b506103bb6104cd3660046150ff565b61111d565b3480156104de57600080fd5b506103136104ed36600461504d565b611139565b6103bb61050036600461526d565b6111cf565b34801561051157600080fd5b506103bb6105203660046150ff565b6114e8565b34801561053157600080fd5b506103bb6105403660046153f4565b611562565b34801561055157600080fd5b506103bb611c78565b34801561056657600080fd5b506103bb610575366004614f73565b611c93565b34801561058657600080fd5b50610313600080516020615f6b83398151915281565b3480156105a857600080fd5b506103bb6105b73660046153a8565b611cae565b3480156105c857600080fd5b506105f26105d73660046150e7565b6000908152601a602052604090206001015463ffffffff1690565b60405163ffffffff90911681526020016102e8565b34801561061357600080fd5b506103136106223660046150e7565b611d9f565b34801561063357600080fd5b506103bb610642366004614ee0565b611e40565b34801561065357600080fd5b506103bb6106623660046153a8565b611ec1565b34801561067357600080fd5b50610336611efe565b34801561068857600080fd5b506105f26106973660046150e7565b611f16565b3480156106a857600080fd5b506103bb6106b7366004615384565b611f58565b3480156106c857600080fd5b506103836106d73660046150e7565b611fbe565b3480156106e857600080fd5b506106fc6106f7366004614ec4565b612035565b6040516102e891906157eb565b34801561071557600080fd5b506107296107243660046150e7565b6126a4565b6040516102e8919061595f565b34801561074257600080fd5b5060155461075890600160201b900461ffff1681565b60405161ffff90911681526020016102e8565b34801561077757600080fd5b50610313610786366004614ec4565b612708565b34801561079757600080fd5b506103bb61278f565b3480156107ac57600080fd5b50336000908152601b602052604090205461ffff16610758565b3480156107d257600080fd5b506103bb6107e1366004614ec4565b6127ca565b3480156107f257600080fd5b506103bb610801366004615384565b612822565b34801561081257600080fd5b50610383612865565b34801561082757600080fd5b506103bb61083636600461542f565b612874565b34801561084757600080fd5b506103bb6108563660046150e7565b6128a9565b34801561086757600080fd5b506102dc6108763660046150ff565b6128c7565b34801561088757600080fd5b506103366128f2565b34801561089c57600080fd5b50610313600081565b3480156108b157600080fd5b506103bb6108c036600461501c565b612901565b3480156108d157600080fd5b506103366108e03660046150e7565b61290c565b3480156108f157600080fd5b506103bb6109003660046152e0565b612968565b34801561091157600080fd5b506103bb610920366004614fb3565b61299c565b34801561093157600080fd5b5061031360185481565b34801561094757600080fd5b506103366109563660046150e7565b6129ce565b34801561096757600080fd5b506103bb6109763660046150ff565b612fb7565b34801561098757600080fd5b506103bb6109963660046153c9565b612fd3565b3480156109a757600080fd5b506103bb6109b636600461515b565b61301c565b3480156109c757600080fd5b50610336613055565b3480156109dc57600080fd5b506102dc6109eb366004614f3b565b6130d6565b3480156109fc57600080fd5b506015546105f29063ffffffff1681565b348015610a1957600080fd5b506103bb610a28366004614ec4565b613104565b348015610a3957600080fd5b506103bb610a483660046153c9565b6131a1565b348015610a5957600080fd5b506103bb610a68366004614ec4565b6131ea565b6000610a7882613216565b92915050565b606060008054610a8d90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab990615c91565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b6000818152601a60205260409020600901805460609190610b3090615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90615c91565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b50505050509050919050565b6000610bc08261323b565b610c265760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c4d82611fbe565b9050806001600160a01b0316836001600160a01b03161415610cbb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c1d565b336001600160a01b0382161480610cd75750610cd781336130d6565b610d445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c1d565b610d4e8383613258565b505050565b600080516020615f6b833981519152610d6b816132c6565b60005b61ffff8116831115610e15576001601b600086868561ffff16818110610da457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610db99190614ec4565b6001600160a01b03168152602081019190915260400160009081208054909190610de890849061ffff16615b67565b92506101000a81548161ffff021916908361ffff1602179055508080610e0d90615cc6565b915050610d6e565b50505050565b33610e2585611fbe565b6001600160a01b031614610e9b5760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374206f776e207468652070617373706f727420746f20636c61604482015276696d2077696e206368616e636520696e6372656173657360481b6064820152608401610c1d565b600f54604051634af2407160e01b81526001600160a01b0390911690634af2407190610ed1908790879087908790600401615acb565b600060405180830381600087803b158015610eeb57600080fd5b505af1158015610eff573d6000803e3d6000fd5b5050505050505050565b600080516020615f6b833981519152610f21816132c6565b506015805461ffff909216600160201b0261ffff60201b19909216919091179055565b610f4e33826132d0565b610f6a5760405162461bcd60e51b8152600401610c1d90615a7a565b610d4e83838361339a565b6000908152600b602052604090206001015490565b336000908152601b602052604090205461ffff80831691161015610fec5760405162461bcd60e51b81526020600482015260196024820152781b9bdd081bdb881d1a1948199c9959481b5a5b9d081b1a5cdd603a1b6044820152606401610c1d565b60005b8161ffff168161ffff16101561105b5761100a33600261352f565b336000908152601b6020526040812080546001929061102e90849061ffff16615bf7565b92506101000a81548161ffff021916908361ffff160217905550808061105390615cc6565b915050610fef565b5050565b600080516020615fab833981519152611077816132c6565b816001600160a01b031661108a84611fbe565b6001600160a01b0316146110e05760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206e6565647320746f206f776e207468652070617373706f7274006044820152606401610c1d565b60408051808201825260048152636e6f6e6560e01b60208083019182526000878152601a909152929092209051610e159260099092019190614cd4565b61112682610f75565b61112f816132c6565b610d4e8383613b9f565b600061114483612708565b82106111a65760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c1d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6111d7612865565b6001600160a01b03166111ea8383613c25565b6001600160a01b0316146112345760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b6044820152606401610c1d565b601c816040516112449190615595565b9081526040519081900360200190205460ff16156112a45760405162461bcd60e51b815260206004820181905260248201527f5369676e61747572652068617320616c7265616479206265656e20757365642e6044820152606401610c1d565b60155461ffff600160201b90910481169086161061131c5760405162461bcd60e51b815260206004820152602f60248201527f547279696e6720746f206d696e74206d6f7265207468656e206d617820616c6c60448201526e1bddd959081c195c881dd85b1b195d608a1b6064820152608401610c1d565b60185461132d9061ffff8716615bd8565b34101561136e5760405162461bcd60e51b815260206004820152600f60248201526e0dcdee840e0c2d2c840cadcdeeaced608b1b6044820152606401610c1d565b601554611387908690600160201b900461ffff16615bf7565b61ffff1661139433612708565b106113b15760405162461bcd60e51b8152600401610c1d90615a10565b60155463ffffffff16600161ffff87166113ca60145490565b6113d49190615b8d565b6113de9190615c1a565b111561142c5760405162461bcd60e51b815260206004820152601d60248201527f57696c6c2074616b6520796f75206f766572206d617820737570706c790000006044820152606401610c1d565b6001601c8260405161143e9190615595565b908152604051908190036020019020805491151560ff1990921691909117905560005b8561ffff168161ffff1610156114a3578315611486576114818486613c7e565b611491565b61149185600161352f565b8061149b81615cc6565b915050611461565b506018546114b59061ffff8716615bd8565b3411156114e1576114e1336018548761ffff166114d29190615bd8565b6114dc9034615c1a565b613d8d565b5050505050565b6001600160a01b03811633146115585760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610c1d565b61105b8282613ea3565b600080516020615fab83398151915261157a816132c6565b6000848152601a602052604090206001015463ffffffff808416600160201b909204161061182a576040805180820182526006815265131959d95b9960d21b60208083019182526000888152601a9091529290922090516115e19260039092019190614cd4565b50600d54601980546000926001600160a01b03169163aa158c3891849061161857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160036040518363ffffffff1660e01b81526004016116419291906159ab565b60006040518083038186803b15801561165957600080fd5b505afa15801561166d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261169591908101906151c3565b51111561182557600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c38916116e2916008909101906003906004016159ab565b60006040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261173691908101906151c3565b601a6000868152602001908152602001600020600501908051906020019061175f929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a849425916117a6916008909101906003906004016159ab565b60006040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117fa91908101906151c3565b601a60008681526020019081526020016000206007019080519060200190611823929190614cd4565b505b610e15565b6000848152601a602052604090206001015463ffffffff808516600160201b909204161080159061187b57506000848152601a602052604090206001015463ffffffff808416600160201b90920416105b15611a855760408051808201825260078152662834b7b732b2b960c91b60208083019182526000888152601a9091529290922090516118c09260039092019190614cd4565b50600d54601980546000926001600160a01b03169163aa158c389184906118f757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160026040518363ffffffff1660e01b81526004016119209291906159ab565b60006040518083038186803b15801561193857600080fd5b505afa15801561194c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261197491908101906151c3565b51111561182557600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c38916119c1916008909101906002906004016159ab565b60006040518083038186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a1591908101906151c3565b601a60008681526020019081526020016000206005019080519060200190611a3e929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a849425916117a6916008909101906002906004016159ab565b6000848152601a602052604090206001015463ffffffff808516600160201b909204161015610e155760408051808201825260098152682730bb34b3b0ba37b960b91b60208083019182526000888152601a909152929092209051611af09260039092019190614cd4565b50600d546000858152601a6020526040908190209051631542b18760e31b81526001600160a01b039092169163aa158c3891611b37916008909101906001906004016159ab565b60006040518083038186803b158015611b4f57600080fd5b505afa158015611b63573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b8b91908101906151c3565b601a60008681526020019081526020016000206005019080519060200190611bb4929190614cd4565b50600d546000858152601a6020526040908190209051631a84942560e01b81526001600160a01b0390921691631a84942591611bfb916008909101906001906004016159ab565b60006040518083038186803b158015611c1357600080fd5b505afa158015611c27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c4f91908101906151c3565b601a600086815260200190815260200160002060070190805190602001906114e1929190614cd4565b6013544790611c90906001600160a01b031682613d8d565b50565b610d4e8383836040518060200160405280600081525061299c565b600080516020615fab833981519152611cc6816132c6565b6000838152601a60205260409020600a018054611ce590600190615c1a565b81548110611d0357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154601a6000858152602001908152602001600020600a018381548110611d4357634e487b7160e01b600052603260045260246000fd5b9060005260206000200181905550601a6000848152602001908152602001600020600a01805480611d8457634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055505050565b6000611daa60085490565b8210611e0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c1d565b60088281548110611e2e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600080516020615f6b833981519152611e58816132c6565b50600e80546001600160a01b039485166001600160a01b03199182168117909255600f8054821690921790915560108054938516938216939093179092556011805491841691831682179055601280548316909117905560138054939092169216919091179055565b600080516020615fab833981519152611ed9816132c6565b506000908152601a602090815260408220600a01805460018101825590835291200155565b6060611f11611f0c60145490565b613f0a565b905090565b6000600080516020615fab833981519152611f30816132c6565b6000838152601a6020526040902060010154600160201b900463ffffffff1691505b50919050565b600080516020615fab833981519152611f70816132c6565b6000838152601a60205260408120600101805461ffff85169290611f9b90849063ffffffff16615ba5565b92506101000a81548163ffffffff021916908363ffffffff160217905550505050565b6000818152600260205260408120546001600160a01b031680610a785760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c1d565b6060600061204283612708565b90506000816001600160401b0381111561206c57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561210d57816020015b6120fa60405180610180016040528060008152602001600063ffffffff168152602001600063ffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161208a5790505b50905060005b8281101561269c5760006121278683611139565b6000818152601a602090815260409182902082516101808101845281548152600182015463ffffffff80821694830194909452600160201b900490921692820192909252600282018054939450909260608401919061218590615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546121b190615c91565b80156121fe5780601f106121d3576101008083540402835291602001916121fe565b820191906000526020600020905b8154815290600101906020018083116121e157829003601f168201915b5050505050815260200160038201805461221790615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461224390615c91565b80156122905780601f1061226557610100808354040283529160200191612290565b820191906000526020600020905b81548152906001019060200180831161227357829003601f168201915b505050505081526020016004820180546122a990615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546122d590615c91565b80156123225780601f106122f757610100808354040283529160200191612322565b820191906000526020600020905b81548152906001019060200180831161230557829003601f168201915b5050505050815260200160058201805461233b90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461236790615c91565b80156123b45780601f10612389576101008083540402835291602001916123b4565b820191906000526020600020905b81548152906001019060200180831161239757829003601f168201915b505050505081526020016006820180546123cd90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546123f990615c91565b80156124465780601f1061241b57610100808354040283529160200191612446565b820191906000526020600020905b81548152906001019060200180831161242957829003601f168201915b5050505050815260200160078201805461245f90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461248b90615c91565b80156124d85780601f106124ad576101008083540402835291602001916124d8565b820191906000526020600020905b8154815290600101906020018083116124bb57829003601f168201915b505050505081526020016008820180546124f190615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461251d90615c91565b801561256a5780601f1061253f5761010080835404028352916020019161256a565b820191906000526020600020905b81548152906001019060200180831161254d57829003601f168201915b5050505050815260200160098201805461258390615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546125af90615c91565b80156125fc5780601f106125d1576101008083540402835291602001916125fc565b820191906000526020600020905b8154815290600101906020018083116125df57829003601f168201915b50505050508152602001600a820180548060200260200160405190810160405280929190818152602001828054801561265457602002820191906000526020600020905b815481526020019060010190808311612640575b50505050508152505083838151811061267d57634e487b7160e01b600052603260045260246000fd5b602002602001018190525050808061269490615ce8565b915050612113565b509392505050565b6000818152601a6020908152604091829020600a01805483518184028101840190945280845260609392830182828015610ba957602002820191906000526020600020905b8154815260200190600101908083116126e95750505050509050919050565b60006001600160a01b0382166127735760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c1d565b506001600160a01b031660009081526003602052604090205490565b33612798612865565b6001600160a01b0316146127be5760405162461bcd60e51b8152600401610c1d90615a45565b6127c86000614023565b565b600080516020615f6b8339815191526127e2816132c6565b6001600160a01b0382166127f557600080fd5b50600c80546001600160a01b039092166001600160a01b03199283168117909155600d8054909216179055565b600080516020615fab83398151915261283a816132c6565b6000838152601a60205260408120600101805461ffff85169290611f9b90849063ffffffff16615c31565b600a546001600160a01b031690565b600080516020615f6b83398151915261288c816132c6565b506015805463ffffffff191663ffffffff92909216919091179055565b600080516020615f6b8339815191526128c1816132c6565b50601855565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610a8d90615c91565b61105b338383614075565b6000818152601a6020908152604080832090516060939261295192600281019260088201926004830192600581019260068201926009830192600301918791016155b1565b60408051601f198184030181529190529392505050565b600080516020615f6b833981519152612980816132c6565b6000848152601a602052604090206114e1906009018484614d58565b6129a633836132d0565b6129c25760405162461bcd60e51b8152600401610c1d90615a7a565b610e1584848484614140565b6000818152601a6020908152604080832081516101808101835281548152600182015463ffffffff80821695830195909552600160201b90049093169183019190915260028101805460609493929183860191612a2a90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612a5690615c91565b8015612aa35780601f10612a7857610100808354040283529160200191612aa3565b820191906000526020600020905b815481529060010190602001808311612a8657829003601f168201915b50505050508152602001600382018054612abc90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612ae890615c91565b8015612b355780601f10612b0a57610100808354040283529160200191612b35565b820191906000526020600020905b815481529060010190602001808311612b1857829003601f168201915b50505050508152602001600482018054612b4e90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612b7a90615c91565b8015612bc75780601f10612b9c57610100808354040283529160200191612bc7565b820191906000526020600020905b815481529060010190602001808311612baa57829003601f168201915b50505050508152602001600582018054612be090615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0c90615c91565b8015612c595780601f10612c2e57610100808354040283529160200191612c59565b820191906000526020600020905b815481529060010190602001808311612c3c57829003601f168201915b50505050508152602001600682018054612c7290615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9e90615c91565b8015612ceb5780601f10612cc057610100808354040283529160200191612ceb565b820191906000526020600020905b815481529060010190602001808311612cce57829003601f168201915b50505050508152602001600782018054612d0490615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3090615c91565b8015612d7d5780601f10612d5257610100808354040283529160200191612d7d565b820191906000526020600020905b815481529060010190602001808311612d6057829003601f168201915b50505050508152602001600882018054612d9690615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc290615c91565b8015612e0f5780601f10612de457610100808354040283529160200191612e0f565b820191906000526020600020905b815481529060010190602001808311612df257829003601f168201915b50505050508152602001600982018054612e2890615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5490615c91565b8015612ea15780601f10612e7657610100808354040283529160200191612ea1565b820191906000526020600020905b815481529060010190602001808311612e8457829003601f168201915b50505050508152602001600a8201805480602002602001604051908101604052809291908181526020018280548015612ef957602002820191906000526020600020905b815481526020019060010190808311612ee5575b5050509190925250506012546101608301515160208401516040808601519051632acabed360e01b8152600481018a9052602481019390935263ffffffff91821660448401521660648201529293506001600160a01b031691632acabed3915060840160006040518083038186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fb091908101906151c3565b9392505050565b612fc082610f75565b612fc9816132c6565b610d4e8383613ea3565b600080516020615fab833981519152612feb816132c6565b6000838152601a602052604090206001018054839190600490611f9b908490600160201b900463ffffffff16615ba5565b600080516020615f6b833981519152613034816132c6565b61304060168686614d58565b5061304d60178484614d58565b505050505050565b6012546040805163e8a3d48560e01b815290516060926001600160a01b03169163e8a3d485916004808301926000929190829003018186803b15801561309a57600080fd5b505afa1580156130ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f1191908101906151c3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361310d612865565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610c1d90615a45565b6001600160a01b0381166131985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b611c9081614023565b600080516020615fab8339815191526131b9816132c6565b6000838152601a602052604090206001018054839190600490611f9b908490600160201b900463ffffffff16615c31565b600080516020615f6b833981519152613202816132c6565b61105b82600161352f565b80546001019055565b60006001600160e01b03198216637965db0b60e01b1480610a785750610a7882614173565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061328d82611fbe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c908133614198565b60006132db8261323b565b61333c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c1d565b600061334783611fbe565b9050806001600160a01b0316846001600160a01b0316148061336e575061336e81856130d6565b806133925750836001600160a01b031661338784610bb5565b6001600160a01b0316145b949350505050565b826001600160a01b03166133ad82611fbe565b6001600160a01b0316146134115760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c1d565b6001600160a01b0382166134735760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c1d565b61347e8383836141fc565b613489600082613258565b6001600160a01b03831660009081526003602052604081208054600192906134b2908490615c1a565b90915550506001600160a01b03821660009081526003602052604081208054600192906134e0908490615b8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615f8b83398151915291a4505050565b600061353a60145490565b60155490915063ffffffff168111156135865760405162461bcd60e51b815260206004820152600e60248201526d151bc81b585b9e481b5a5b9d195960921b6044820152606401610c1d565b601554600160201b900461ffff1661359d84612708565b106135ba5760405162461bcd60e51b8152600401610c1d90615a10565b600060196135c9600684615d03565b815481106135e757634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546135fc90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461362890615c91565b80156136755780601f1061364a57610100808354040283529160200191613675565b820191906000526020600020905b81548152906001019060200180831161365857829003601f168201915b5050505050905060006016805461368b90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546136b790615c91565b80156137045780601f106136d957610100808354040283529160200191613704565b820191906000526020600020905b8154815290600101906020018083116136e757829003601f168201915b505050505090506002836137189190615d03565b600114156137ae576017805461372d90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461375990615c91565b80156137a65780601f1061377b576101008083540402835291602001916137a6565b820191906000526020600020905b81548152906001019060200180831161378957829003601f168201915b505050505090505b6137b88584614207565b6040518061018001604052808481526020018563ffffffff168152602001600063ffffffff1681526020016040518060400160405280601981526020017813595d1c9bdc1bdb1a5cc815dbdc9b190814185cdcdc1bdc9d603a1b8152508152602001604051806040016040528060098152602001682730bb34b3b0ba37b960b91b81525081526020016040518061020001604052806101d68152602001615d956101d691398152600d54604051631542b18760e31b81526020909201916001600160a01b039091169063aa158c3890613898908790600190600401615985565b60006040518083038186803b1580156138b057600080fd5b505afa1580156138c4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138ec91908101906151c3565b8152600d546040516385c496ad60e01b81526020909201916001600160a01b03909116906385c496ad90613924908790600401615972565b60006040518083038186803b15801561393c57600080fd5b505afa158015613950573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261397891908101906151c3565b8152600d54604051631a84942560e01b81526020909201916001600160a01b0390911690631a849425906139b3908790600190600401615985565b60006040518083038186803b1580156139cb57600080fd5b505afa1580156139df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a0791908101906151c3565b815260208101849052604081018390526060016000604051908082528060200260200182016040528015613a45578160200160208202803683370190505b5090526000848152601a602090815260409182902083518155838201516001820180549486015163ffffffff908116600160201b026001600160401b03199096169216919091179390931790925560608301518051613aaa9260028501920190614cd4565b5060808201518051613ac6916003840191602090910190614cd4565b5060a08201518051613ae2916004840191602090910190614cd4565b5060c08201518051613afe916005840191602090910190614cd4565b5060e08201518051613b1a916006840191602090910190614cd4565b506101008201518051613b37916007840191602090910190614cd4565b506101208201518051613b54916008840191602090910190614cd4565b506101408201518051613b71916009840191602090910190614cd4565b506101608201518051613b8e91600a840191602090910190614dcc565b5050601480546001019055506114e1565b613ba982826128c7565b61105b576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055613be13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6020820152603c81018390526000908190605c016040516020818303038152906040528051906020012090506133928184614221565b6000613c8960145490565b9050808310613ccd5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610c1d565b613cd882600261352f565b600f60009054906101000a90046001600160a01b03166001600160a01b031663139dbb6a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2657600080fd5b505afa158015613d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5e9190615251565b6000848152601a60205260408120600101805461ffff9390931692909190611f9b90849063ffffffff16615ba5565b80471015613ddd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e2a576040519150601f19603f3d011682016040523d82523d6000602084013e613e2f565b606091505b5050905080610d4e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b6064820152608401610c1d565b613ead82826128c7565b1561105b576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606081613f2e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613f585780613f4281615ce8565b9150613f519050600a83615bc4565b9150613f32565b6000816001600160401b03811115613f8057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613faa576020820181803683370190505b5090505b841561339257613fbf600183615c1a565b9150613fcc600a86615d03565b613fd7906030615b8d565b60f81b818381518110613ffa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061401c600a86615bc4565b9450613fae565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156140d35760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c1d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61414b84848461339a565b6141578484848461423d565b610e155760405162461bcd60e51b8152600401610c1d906159be565b60006001600160e01b0319821663780e9d6360e01b1480610a785750610a788261434a565b6141a282826128c7565b61105b576141ba816001600160a01b0316601461439a565b6141c583602061439a565b6040516020016141d692919061573f565b60408051601f198184030181529082905262461bcd60e51b8252610c1d91600401615972565b610d4e83838361457b565b61105b828260405180602001604052806000815250614633565b60008060006142308585614666565b9150915061269c816146d6565b60006001600160a01b0384163b1561433f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906142819033908990889088906004016157ae565b602060405180830381600087803b15801561429b57600080fd5b505af19250505080156142cb575060408051601f3d908101601f191682019092526142c89181019061513f565b60015b614325573d8080156142f9576040519150601f19603f3d011682016040523d82523d6000602084013e6142fe565b606091505b50805161431d5760405162461bcd60e51b8152600401610c1d906159be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613392565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061437b57506001600160e01b03198216635b5e139f60e01b145b80610a7857506301ffc9a760e01b6001600160e01b0319831614610a78565b606060006143a9836002615bd8565b6143b4906002615b8d565b6001600160401b038111156143d957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614403576020820181803683370190505b509050600360fc1b8160008151811061442c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061446957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061448d846002615bd8565b614498906001615b8d565b90505b600181111561452c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106144da57634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106144fe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361452581615c7a565b905061449b565b508315612fb05760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610c1d565b6001600160a01b0383166145d6576145d181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6145f9565b816001600160a01b0316836001600160a01b0316146145f9576145f983826148d2565b6001600160a01b03821661461057610d4e8161496f565b826001600160a01b0316826001600160a01b031614610d4e57610d4e8282614a48565b61463d8383614a8c565b61464a600084848461423d565b610d4e5760405162461bcd60e51b8152600401610c1d906159be565b60008082516041141561469d5760208301516040840151606085015160001a61469187828585614bb8565b945094505050506146cf565b8251604014156146c757602083015160408401516146bc868383614c9b565b9350935050506146cf565b506000905060025b9250929050565b60008160048111156146f857634e487b7160e01b600052602160045260246000fd5b14156147015750565b600181600481111561472357634e487b7160e01b600052602160045260246000fd5b141561476c5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610c1d565b600281600481111561478e57634e487b7160e01b600052602160045260246000fd5b14156147dc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c1d565b60038160048111156147fe57634e487b7160e01b600052602160045260246000fd5b14156148575760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c1d565b600481600481111561487957634e487b7160e01b600052602160045260246000fd5b1415611c905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c1d565b600060016148df84612708565b6148e99190615c1a565b60008381526007602052604090205490915080821461493c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061498190600190615c1a565b600083815260096020526040812054600880549394509092849081106149b757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106149e657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614a2c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614a5383612708565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216614ae25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c1d565b614aeb8161323b565b15614b375760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c1d565b614b43600083836141fc565b6001600160a01b0382166000908152600360205260408120805460019290614b6c908490615b8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615f8b833981519152908290a45050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115614be55750600090506003614c92565b8460ff16601b14158015614bfd57508460ff16601c14155b15614c0e5750600090506004614c92565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614c62573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614c8b57600060019250925050614c92565b9150600090505b94509492505050565b6000806001600160ff1b03831681614cb860ff86901c601b615b8d565b9050614cc687828885614bb8565b935093505050935093915050565b828054614ce090615c91565b90600052602060002090601f016020900481019282614d025760008555614d48565b82601f10614d1b57805160ff1916838001178555614d48565b82800160010185558215614d48579182015b82811115614d48578251825591602001919060010190614d2d565b50614d54929150614e06565b5090565b828054614d6490615c91565b90600052602060002090601f016020900481019282614d865760008555614d48565b82601f10614d9f5782800160ff19823516178555614d48565b82800160010185558215614d48579182015b82811115614d48578235825591602001919060010190614db1565b828054828255906000526020600020908101928215614d485791602002820182811115614d48578251825591602001919060010190614d2d565b5b80821115614d545760008155600101614e07565b600082601f830112614e2b578081fd5b8135614e3e614e3982615b40565b615b10565b818152846020838601011115614e52578283fd5b816020850160208301379081016020019190915292915050565b60008083601f840112614e7d578182fd5b5081356001600160401b03811115614e93578182fd5b6020830191508360208285010111156146cf57600080fd5b803563ffffffff81168114614ebf57600080fd5b919050565b600060208284031215614ed5578081fd5b8135612fb081615d59565b60008060008060808587031215614ef5578283fd5b8435614f0081615d59565b93506020850135614f1081615d59565b92506040850135614f2081615d59565b91506060850135614f3081615d59565b939692955090935050565b60008060408385031215614f4d578182fd5b8235614f5881615d59565b91506020830135614f6881615d59565b809150509250929050565b600080600060608486031215614f87578283fd5b8335614f9281615d59565b92506020840135614fa281615d59565b929592945050506040919091013590565b60008060008060808587031215614fc8578384fd5b8435614fd381615d59565b93506020850135614fe381615d59565b92506040850135915060608501356001600160401b03811115615004578182fd5b61501087828801614e1b565b91505092959194509250565b6000806040838503121561502e578182fd5b823561503981615d59565b915060208301358015158114614f68578182fd5b6000806040838503121561505f578182fd5b823561506a81615d59565b946020939093013593505050565b6000806020838503121561508a578182fd5b82356001600160401b03808211156150a0578384fd5b818501915085601f8301126150b3578384fd5b8135818111156150c1578485fd5b8660208260051b85010111156150d5578485fd5b60209290920196919550909350505050565b6000602082840312156150f8578081fd5b5035919050565b60008060408385031215615111578182fd5b823591506020830135614f6881615d59565b600060208284031215615134578081fd5b8135612fb081615d6e565b600060208284031215615150578081fd5b8151612fb081615d6e565b60008060008060408587031215615170578182fd5b84356001600160401b0380821115615186578384fd5b61519288838901614e6c565b909650945060208701359150808211156151aa578384fd5b506151b787828801614e6c565b95989497509550505050565b6000602082840312156151d4578081fd5b81516001600160401b038111156151e9578182fd5b8201601f810184136151f9578182fd5b8051615207614e3982615b40565b81815285602083850101111561521b578384fd5b61522c826020830160208601615c4e565b95945050505050565b600060208284031215615246578081fd5b8135612fb081615d84565b600060208284031215615262578081fd5b8151612fb081615d84565b600080600080600060a08688031215615284578283fd5b853561528f81615d84565b9450602086013561529f81615d59565b9350604086013592506060860135915060808601356001600160401b038111156152c7578182fd5b6152d388828901614e1b565b9150509295509295909350565b6000806000604084860312156152f4578081fd5b8335925060208401356001600160401b03811115615310578182fd5b61531c86828701614e6c565b9497909650939450505050565b6000806000806060858703121561533e578182fd5b8435935060208501356001600160401b0381111561535a578283fd5b61536687828801614e6c565b9094509250615379905060408601614eab565b905092959194509250565b60008060408385031215615396578182fd5b823591506020830135614f6881615d84565b600080604083850312156153ba578182fd5b50508035926020909101359150565b600080604083850312156153db578182fd5b823591506153eb60208401614eab565b90509250929050565b600080600060608486031215615408578081fd5b8335925061541860208501614eab565b915061542660408501614eab565b90509250925092565b600060208284031215615440578081fd5b612fb082614eab565b6000815180845260208085019450808401835b838110156154785781518752958201959082019060010161545c565b509495945050505050565b6000815180845261549b816020860160208601615c4e565b601f01601f19169290920160200192915050565b600081546154bc81615c91565b8085526020600183811680156154d957600181146154ed5761551b565b60ff1985168884015260408801955061551b565b866000528260002060005b858110156155135781548a82018601529083019084016154f8565b890184019650505b505050505092915050565b6000815461553381615c91565b6001828116801561554b576001811461555c5761558b565b60ff1984168752828701945061558b565b8560005260208060002060005b858110156155825781548a820152908401908201615569565b50505082870194505b5050505092915050565b600082516155a7818460208701615c4e565b9190910192915050565b693d913730b6b2911d101160b11b815260006155d0600a83018b615526565b6101d160f51b81526155e5600282018b615526565b72111610113232b9b1b934b83a34b7b7111d101160691b8152905061560d601382018a615526565b6c1116101134b6b0b3b2911d101160991b8152905061562f600d820189615526565b741116101130b734b6b0ba34b7b72fbab936111d101160591b815290506156596015820188615526565b7f222c202261747472696275746573223a205b7b202274726169745f74797065228152781d101120bb30ba30b9102ba6111610113b30b63ab2911d101160391b602082015290506156ad6039820187615526565b7f227d2c7b202274726169745f74797065223a202252616e6b222c202276616c7581526432911d101160d91b602082015290506156ed6025820186615526565b7f227d2c7b202274726169745f74797065223a2022456c656d656e74222c20227681526730b63ab2911d101160c11b602082015290506157306028820185615526565b9b9a5050505050505050505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351615771816017850160208801615c4e565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516157a2816028840160208801615c4e565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906157e190830184615483565b9695505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561595157603f198984030185528151805184528781015163ffffffff90811689860152878201511687850152606080820151610180828701819052919061585e83880182615483565b92505050608080830151868303828801526158798382615483565b9250505060a080830151868303828801526158948382615483565b9250505060c080830151868303828801526158af8382615483565b9250505060e080830151868303828801526158ca8382615483565b9250505061010080830151868303828801526158e68382615483565b9250505061012080830151868303828801526159028382615483565b92505050610140808301518683038288015261591e8382615483565b92505050610160808301519250858203818701525061593d8183615449565b968901969450505090860190600101615811565b509098975050505050505050565b602081526000612fb06020830184615449565b602081526000612fb06020830184615483565b6040815260006159986040830185615483565b905061ffff831660208301529392505050565b60408152600061599860408301856154af565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f6164647265737320616c7265616479206f776e73206d617820616c6c6f776564604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b8481526060602082015282606082015282846080830137600080608085840101526080601f19601f860116830101905063ffffffff8316604083015295945050505050565b604051601f8201601f191681016001600160401b0381118282101715615b3857615b38615d43565b604052919050565b60006001600160401b03821115615b5957615b59615d43565b50601f01601f191660200190565b600061ffff808316818516808303821115615b8457615b84615d17565b01949350505050565b60008219821115615ba057615ba0615d17565b500190565b600063ffffffff808316818516808303821115615b8457615b84615d17565b600082615bd357615bd3615d2d565b500490565b6000816000190483118215151615615bf257615bf2615d17565b500290565b600061ffff83811690831681811015615c1257615c12615d17565b039392505050565b600082821015615c2c57615c2c615d17565b500390565b600063ffffffff83811690831681811015615c1257615c12615d17565b60005b83811015615c69578181015183820152602001615c51565b83811115610e155750506000910152565b600081615c8957615c89615d17565b506000190190565b600181811c90821680615ca557607f821691505b60208210811415611f5257634e487b7160e01b600052602260045260246000fd5b600061ffff80831681811415615cde57615cde615d17565b6001019392505050565b6000600019821415615cfc57615cfc615d17565b5060010190565b600082615d1257615d12615d2d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611c9057600080fd5b6001600160e01b031981168114611c9057600080fd5b61ffff81168114611c9057600080fdfe546865204d6574726f706f6c697320576f726c642050617373706f72742070726f76696465732061636365737320746f20746865207661737420616e6420657665722d657870616e64696e6720776f726c64206f66204d6574726f706f6c69732e205769746820796f75722050617373706f72742c20796f752077696c6c2062652061626c6520746f20756e6c6f636b20796f75722067616d65722070726f66696c652c206861766520612067756172616e7465656420574c20666f72206f6e65206f66206f757220617661746172732c2061206368616e6365206174206f776e696e67206120756e69717565203178312070726f706572747920696e206f6e65206f66206f7572206369746965732c2061732077656c6c2061732061636365737320746f207370656369616c206576656e747320616e6420657870657269656e6365732e20417320796f7520696d6d6572736520796f757273656c662077697468696e204d6574726f706f6c697320576f726c6420796f75722050617373706f72742077696c6c2065766f6c76652c20676976696e6720796f75206120756e69717565206761746577617920696e746f20746865206361706974616c20636974696573206f6620746865204d65746176657273652e73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dabddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef364d3d7565c7a8300c96fd53e065d19b65848d7b23b3191adcd55621c744223ca2646970667358221220e07b61463a774c4ae0939e50174c68bdb996f149bea4ea8e2515160b15a0a78164736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc4490000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
-----Decoded View---------------
Arg [0] : imageContract (address): 0x084d1301407B08f3feA7D9fFeae4c89d3e9BC449
Arg [1] : admin (address): 0x5D2FD8f39c24Ac0338fC6268119ca8c500aE3086
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000084d1301407b08f3fea7d9ffeae4c89d3e9bc449
Arg [1] : 0000000000000000000000005d2fd8f39c24ac0338fc6268119ca8c500ae3086
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 ]
[ 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.