More Info
Private Name Tags
Latest 25 from a total of 650 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x48656c6c | 20508581 | 160 days ago | IN | 0 ETH | 0.00003074 | ||||
Rescue | 19096322 | 358 days ago | IN | 0 ETH | 0.00730826 | ||||
Rescue | 18452446 | 448 days ago | IN | 0 ETH | 0.0013976 | ||||
Rescue | 18452442 | 448 days ago | IN | 0 ETH | 0.00149979 | ||||
Rescue | 17859635 | 531 days ago | IN | 0 ETH | 0.00154702 | ||||
Rescue | 17545386 | 575 days ago | IN | 0 ETH | 0.00177531 | ||||
Rescue | 17470292 | 586 days ago | IN | 0 ETH | 0.00482671 | ||||
Rescue | 17015452 | 650 days ago | IN | 0 ETH | 0.01313138 | ||||
Rescue | 16907066 | 665 days ago | IN | 0 ETH | 0.00168103 | ||||
Rescue | 16880795 | 669 days ago | IN | 0 ETH | 0.00685677 | ||||
Rescue | 16878200 | 669 days ago | IN | 0 ETH | 0.05047147 | ||||
Rescue | 16858658 | 672 days ago | IN | 0 ETH | 0.00140503 | ||||
Rescue | 16858652 | 672 days ago | IN | 0 ETH | 0.00181135 | ||||
Rescue | 16858648 | 672 days ago | IN | 0 ETH | 0.00167297 | ||||
Rescue | 16858641 | 672 days ago | IN | 0 ETH | 0.00230701 | ||||
Rescue | 16852926 | 673 days ago | IN | 0 ETH | 0.04590149 | ||||
Rescue | 16739128 | 689 days ago | IN | 0 ETH | 0.00350565 | ||||
Rescue | 16739123 | 689 days ago | IN | 0 ETH | 0.00072973 | ||||
Rescue | 16718433 | 692 days ago | IN | 0 ETH | 0.01661871 | ||||
Rescue | 16718399 | 692 days ago | IN | 0 ETH | 0.00355175 | ||||
Rescue | 16718342 | 692 days ago | IN | 0 ETH | 0.00311181 | ||||
Rescue | 16661781 | 700 days ago | IN | 0 ETH | 0.02935766 | ||||
Rescue | 16495676 | 723 days ago | IN | 0 ETH | 0.00485382 | ||||
Rescue | 16452504 | 729 days ago | IN | 0 ETH | 0.00197753 | ||||
Rescue | 16379945 | 739 days ago | IN | 0 ETH | 0.00233086 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TrainingGrounds
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "./interfaces/IWnD.sol"; import "./interfaces/IGP.sol"; import "./interfaces/ITrainingGrounds.sol"; import "./interfaces/ISacrificialAlter.sol"; import "hardhat/console.sol"; contract TrainingGrounds is ITrainingGrounds, Ownable, ReentrancyGuard, IERC721Receiver, Pausable { using EnumerableSet for EnumerableSet.UintSet; //magic rune tokenId uint256 public constant magicRune = 7; //whip tokenId uint256 public constant whip = 6; // maximum rank for a Wizard/Dragon uint8 public constant MAX_RANK = 8; //time to stake for reward uint80 public constant timeToStakeForReward = 2 days; uint16 public constant MAX_WHIP_EMISSION = 16000; uint16 public constant MAX_MAGIC_RUNE_EMISSION = 1600; uint16 public curWhipsEmitted; uint16 public curMagicRunesEmitted; struct StakeWizard { uint16 tokenId; uint80 lastClaimTime; address owner; } // dragons are in both pools at the same time struct StakeDragon { uint16 tokenId; uint80 lastClaimTime; address owner; uint256 value; // uint256 because the previous variables pack an entire 32bits } struct Deposits { EnumerableSet.UintSet towerWizards; EnumerableSet.UintSet trainingWizards; EnumerableSet.UintSet dragons; } // address => allowedToCallFunctions mapping(address => bool) private admins; uint256 private totalRankStaked; uint256 private numWizardsStaked; event TokenStaked(address indexed owner, uint256 indexed tokenId, bool indexed isWizard, bool isTraining); event WizardClaimed(address indexed owner, uint256 indexed tokenId, bool indexed unstaked); event DragonClaimed(address indexed owner, uint256 indexed tokenId, bool indexed unstaked); // reference to the WnD NFT contract IWnD public wndNFT; // reference to the $GP contract for minting $GP earnings IGP public gpToken; // reference to sacrificial alter ISacrificialAlter public alter; // maps tokenId to stake mapping(uint256 => StakeWizard) private tower; // maps tokenId to stake mapping(uint256 => StakeWizard) private training; // maps rank to all Dragon staked with that rank mapping(uint256 => StakeDragon[]) private flight; // tracks location of each Dragon in Flight mapping(uint256 => uint256) private flightIndices; mapping(address => Deposits) private _deposits; // any rewards distributed when no dragons are staked uint256 private unaccountedRewards = 0; // amount of $GP due for each rank point staked uint256 private gpPerRank = 0; // wizards earn 12000 $GP per day uint256 public constant DAILY_GP_RATE = 2000 ether; // dragons take a 20% tax on all $GP claimed uint256 public constant GP_CLAIM_TAX_PERCENTAGE_UNTRAINED = 50; // dragons take a 20% tax on all $GP claimed uint256 public constant GP_CLAIM_TAX_PERCENTAGE = 20; // Max earn from staking is 500 million $GP for the training ground uint256 public constant MAXIMUM_GLOBAL_GP = 500000000 ether; // wizards must have 2 days worth of emissions to unstake or else they're still guarding the tower uint256 public constant MINIMUM_TO_EXIT = 2 days; // amount of $GP earned so far uint256 public totalGPEarned; // the last time $GP was claimed uint256 private lastClaimTimestamp; // emergency rescue to allow unstaking without any checks but without $GP bool public rescueEnabled = false; /** */ constructor() { _pause(); } /** CRITICAL TO SETUP */ modifier requireContractsSet() { require(address(wndNFT) != address(0) && address(gpToken) != address(0) && address(alter) != address(0), "Contracts not set"); _; } function setContracts(address _wndNFT, address _gp, address _alter) external onlyOwner { wndNFT = IWnD(_wndNFT); gpToken = IGP(_gp); alter = ISacrificialAlter(_alter); } function depositsOf(address account) external view returns (uint256[] memory) { Deposits storage depositSet = _deposits[account]; uint256[] memory tokenIds = new uint256[] (depositSet.towerWizards.length() + depositSet.trainingWizards.length() + depositSet.dragons.length()); for (uint256 i; i < depositSet.towerWizards.length(); i++) { tokenIds[i] = depositSet.towerWizards.at(i); } for (uint256 i; i < depositSet.trainingWizards.length(); i++) { tokenIds[i + depositSet.towerWizards.length()] = depositSet.trainingWizards.at(i); } for (uint256 i; i < depositSet.dragons.length(); i++) { tokenIds[i + depositSet.towerWizards.length() + depositSet.trainingWizards.length()] = depositSet.dragons.at(i); } return tokenIds; } /** Used to determine if a staked token is owned. Used to allow game logic to occur outside this contract. * This might not be necessary if the training mechanic is in this contract instead */ function ownsToken(uint256 tokenId) external view returns (bool) { uint64 lastTokenWrite = wndNFT.getTokenWriteBlock(tokenId); // Must check this, as getTokenTraits will be allowed since this contract is an admin require(lastTokenWrite < block.number, "hmmmm what doing?"); IWnD.WizardDragon memory s = wndNFT.getTokenTraits(tokenId); if(s.isWizard) { return tower[tokenId].owner == tx.origin || training[tokenId].owner == tx.origin; } uint8 rank = _rankForDragon(tokenId); return flight[rank][flightIndices[tokenId]].owner == tx.origin; } function isTokenStaked(uint256 tokenId, bool isTraining) external view override returns (bool) { uint64 lastTokenWrite = wndNFT.getTokenWriteBlock(tokenId); // Must check this, as getTokenTraits will be allowed since this contract is an admin require(lastTokenWrite < block.number, "hmmmm what doing?"); IWnD.WizardDragon memory s = wndNFT.getTokenTraits(tokenId); if(s.isWizard) { return isTraining ? training[tokenId].owner != address(0) : tower[tokenId].owner != address(0); } // dragons are staked in both pool, so you can ignore the isTraining bool uint8 rank = _rankForDragon(tokenId); return flight[rank][flightIndices[tokenId]].owner != address(0); } function calculateGpRewards(uint256 tokenId) external view returns (uint256 owed) { uint64 lastTokenWrite = wndNFT.getTokenWriteBlock(tokenId); // Must check this, as getTokenTraits will be allowed since this contract is an admin require(lastTokenWrite < block.number, "hmmmm what doing?"); if(wndNFT.isWizard(tokenId)) { StakeWizard memory stake = tower[tokenId]; require(stake.owner != address(0), "Token not guarding"); if (totalGPEarned < MAXIMUM_GLOBAL_GP) { owed = (block.timestamp - stake.lastClaimTime) * DAILY_GP_RATE / 1 days; } else if (stake.lastClaimTime > lastClaimTimestamp) { owed = 0; // $GP production stopped already } else { owed = (lastClaimTimestamp - stake.lastClaimTime) * DAILY_GP_RATE / 1 days; // stop earning additional $GP if it's all been earned } } else { uint8 rank = _rankForDragon(tokenId); StakeDragon memory stake = flight[rank][flightIndices[tokenId]]; require(stake.owner != address(0), "Token not in flight"); owed = (rank) * (gpPerRank - stake.value); // Calculate portion of tokens based on Rank } } function calculateErcEmissionRewards(uint256 tokenId) external view returns (uint256 owed) { uint64 lastTokenWrite = wndNFT.getTokenWriteBlock(tokenId); // Must check this, as getTokenTraits will be allowed since this contract is an admin require(lastTokenWrite < block.number, "hmmmm what doing?"); if(wndNFT.isWizard(tokenId)) { if(curWhipsEmitted >= MAX_WHIP_EMISSION) { return 0; } StakeWizard memory stake = training[tokenId]; require(stake.owner != address(0), "Token not training"); while(stake.lastClaimTime > 0 && block.timestamp >= stake.lastClaimTime + timeToStakeForReward) { owed += 1; stake.lastClaimTime += timeToStakeForReward; } } else { if(curMagicRunesEmitted >= MAX_MAGIC_RUNE_EMISSION) { return 0; } uint8 rank = _rankForDragon(tokenId); StakeDragon memory stake = flight[rank][flightIndices[tokenId]]; require(stake.owner != address(0), "Token not in flight"); while(stake.lastClaimTime > 0 && block.timestamp >= stake.lastClaimTime + timeToStakeForReward) { owed += 1; stake.lastClaimTime += timeToStakeForReward; } } } /** STAKING */ /** * adds Wizards and Dragons to the Tower and Flight * @param tokenIds the IDs of the Wizards and Dragons to stake */ function addManyToTowerAndFlight(address tokenOwner, uint16[] calldata tokenIds) external override nonReentrant { require(admins[_msgSender()], "Only admins can stake"); for (uint i = 0; i < tokenIds.length; i++) { if (wndNFT.ownerOf(tokenIds[i]) != address(this)) { // a mint + stake will send directly to the staking contract require(wndNFT.ownerOf(tokenIds[i]) == tokenOwner, "You don't own this token"); wndNFT.transferFrom(tokenOwner, address(this), tokenIds[i]); } else if (tokenIds[i] == 0) { continue; // there may be gaps in the array for stolen tokens } if (wndNFT.isWizard(tokenIds[i])) _addWizardToTower(tokenOwner, tokenIds[i]); else _addDragonToFlight(tokenOwner, tokenIds[i]); } } /** * adds Wizards and Dragons to the Tower and Flight * @param seed the seed for random logic * @param tokenIds the IDs of the Wizards and Dragons to stake */ function addManyToTrainingAndFlight(uint256 seed, address tokenOwner, uint16[] calldata tokenIds) external override nonReentrant { require(admins[_msgSender()], "Only admins can stake"); for (uint i = 0; i < tokenIds.length; i++) { require(wndNFT.ownerOf(tokenIds[i]) == tokenOwner, "You don't own this token"); seed = uint256(keccak256(abi.encodePacked( tx.origin, seed ))); address recipient = selectRecipient(seed, tokenOwner); if(tokenIds[i] <= 15000) { // Don't allow gen0 tokens from being stolen recipient = tokenOwner; } if(recipient != tokenOwner) { // stolen wndNFT.transferFrom(tokenOwner, recipient, tokenIds[i]); continue; } wndNFT.transferFrom(tokenOwner, address(this), tokenIds[i]); if (wndNFT.isWizard(tokenIds[i])) { _addWizardToTraining(recipient, tokenIds[i]); } else { _addDragonToFlight(recipient, tokenIds[i]); } } } /** * adds a single Wizard to the Tower * @param account the address of the staker * @param tokenId the ID of the Wizard to add to the Tower */ function _addWizardToTower(address account, uint256 tokenId) internal whenNotPaused { tower[tokenId] = StakeWizard({ owner: account, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp) }); numWizardsStaked += 1; _deposits[account].towerWizards.add(tokenId); emit TokenStaked(account, tokenId, true, false); } function _addWizardToTraining(address account, uint256 tokenId) internal whenNotPaused { training[tokenId] = StakeWizard({ owner: account, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp) }); numWizardsStaked += 1; _deposits[account].trainingWizards.add(tokenId); emit TokenStaked(account, tokenId, true, true); } /** * adds a single Dragon to the Flight * @param account the address of the staker * @param tokenId the ID of the Dragon to add to the Flight */ function _addDragonToFlight(address account, uint256 tokenId) internal { uint8 rank = _rankForDragon(tokenId); totalRankStaked += rank; // Portion of earnings ranges from 8 to 5 flightIndices[tokenId] = flight[rank].length; // Store the location of the dragon in the Flight flight[rank].push(StakeDragon({ owner: account, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp), value: gpPerRank })); // Add the dragon to the Flight _deposits[account].dragons.add(tokenId); emit TokenStaked(account, tokenId, false, true); } /** CLAIMING / UNSTAKING */ /** * realize $GP earnings and optionally unstake tokens from the Tower / Flight * to unstake a Wizard it will require it has 2 days worth of $GP unclaimed * @param tokenIds the IDs of the tokens to claim earnings from * @param unstake whether or not to unstake ALL of the tokens listed in tokenIds */ function claimManyFromTowerAndFlight(address tokenOwner, uint16[] calldata tokenIds, bool unstake) external override whenNotPaused _updateEarnings nonReentrant { require(admins[_msgSender()], "Only admins can stake"); uint256 owed = 0; uint16 owedRunes = 0; for (uint i = 0; i < tokenIds.length; i++) { if (wndNFT.isWizard(tokenIds[i])) { owed += _claimWizardFromTower(tokenIds[i], unstake, tokenOwner); } else { (uint256 gpOwed, uint16 runes) = _claimDragonFromFlight(tokenIds[i], unstake, tokenOwner); owed += gpOwed; owedRunes += runes; } } gpToken.updateOriginAccess(); if(owed > 0) { gpToken.mint(tokenOwner, owed); } if(owedRunes > 0 && curMagicRunesEmitted + owedRunes <= MAX_MAGIC_RUNE_EMISSION) { curMagicRunesEmitted += owedRunes; alter.mint(magicRune, owedRunes, tokenOwner); } } /** * realize $GP earnings and optionally unstake tokens from the Tower / Flight * to unstake a Wizard it will require it has 2 days worth of $GP unclaimed * @param tokenIds the IDs of the tokens to claim earnings from * @param unstake whether or not to unstake ALL of the tokens listed in tokenIds */ function claimManyFromTrainingAndFlight(uint256 seed, address tokenOwner, uint16[] calldata tokenIds, bool unstake) external override whenNotPaused nonReentrant { require(admins[_msgSender()], "Only admins can stake"); uint256 owedGp = 0; uint16 owedWhips = 0; uint16 runes = 0; for (uint i = 0; i < tokenIds.length; i++) { if (wndNFT.isWizard(tokenIds[i])) { owedWhips += _claimWizardFromTraining(seed, tokenIds[i], unstake, tokenOwner); } else { (uint256 gpOwed, uint16 owedRunes) = _claimDragonFromFlight(tokenIds[i], unstake, tokenOwner); owedGp += gpOwed; runes += owedRunes; } } gpToken.updateOriginAccess(); if(owedGp > 0) { gpToken.mint(tokenOwner, owedGp); } if(owedWhips > 0 && curWhipsEmitted + owedWhips <= MAX_WHIP_EMISSION) { curWhipsEmitted += owedWhips; alter.mint(whip, owedWhips, tokenOwner); } if(runes > 0 && curMagicRunesEmitted + runes <= MAX_MAGIC_RUNE_EMISSION) { curMagicRunesEmitted += runes; alter.mint(magicRune, runes, tokenOwner); } } /** * @param seed a random value to select a recipient from * @return the address of the recipient (either the caller or the Dragon thief's owner) */ function selectRecipient(uint256 seed, address tokenOwner) internal view returns (address) { if (((seed >> 245) % 10) != 0) return tokenOwner; address thief = randomDragonOwner(seed >> 144); if (thief == address(0x0)) return tokenOwner; return thief; } /** * realize $GP earnings for a single Wizard and optionally unstake it * if not unstaking, pay a 20% tax to the staked Dragons * if unstaking, there is a 50% chance all $GP is stolen * @param tokenId the ID of the Wizards to claim earnings from * @param unstake whether or not to unstake the Wizards * @return owed - the amount of $GP earned */ function _claimWizardFromTower(uint256 tokenId, bool unstake, address tokenOwner) internal returns (uint256 owed) { require(wndNFT.ownerOf(tokenId) == address(this), "Doesn't own token"); StakeWizard memory stake = tower[tokenId]; require(tokenOwner == stake.owner, "Invalid token owner"); require(!(unstake && block.timestamp - stake.lastClaimTime < MINIMUM_TO_EXIT), "Still guarding the tower"); if (totalGPEarned < MAXIMUM_GLOBAL_GP) { owed = (block.timestamp - stake.lastClaimTime) * DAILY_GP_RATE / 1 days; } else if (stake.lastClaimTime > lastClaimTimestamp) { owed = 0; // $GP production stopped already } else { owed = (lastClaimTimestamp - stake.lastClaimTime) * DAILY_GP_RATE / 1 days; // stop earning additional $GP if it's all been earned } if (unstake) { if (random(stake.tokenId, stake.lastClaimTime, stake.owner) & 1 == 1) { // 50% chance of all $GP stolen _payDragonTax(owed); owed = 0; } delete tower[tokenId]; numWizardsStaked -= 1; _deposits[stake.owner].towerWizards.remove(tokenId); // Always transfer last to guard against reentrance wndNFT.safeTransferFrom(address(this), stake.owner, tokenId, ""); // send back Wizard } else { uint256 taxPercent = getTaxPercent(stake.owner); _payDragonTax(owed * taxPercent / 100); // percentage tax to staked dragons owed = owed * (100 - taxPercent) / 100; // remainder goes to Wizard owner tower[tokenId] = StakeWizard({ owner: stake.owner, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp) }); // reset stake } emit WizardClaimed(stake.owner, tokenId, unstake); } /** Get the tax percent owed to dragons. If the address doesn't contain a 1:10 ratio of whips to staked wizards, * they are subject to an untrained tax */ function getTaxPercent(address addr) internal returns (uint256) { if(_deposits[addr].towerWizards.length() <= 10) { // return alter.balanceOf(addr, whip) >= 1 ? GP_CLAIM_TAX_PERCENTAGE : GP_CLAIM_TAX_PERCENTAGE_UNTRAINED; } return alter.balanceOf(addr, whip) >= _deposits[addr].towerWizards.length() / 10 ? GP_CLAIM_TAX_PERCENTAGE : GP_CLAIM_TAX_PERCENTAGE_UNTRAINED; } function _claimWizardFromTraining(uint256 seed, uint256 tokenId, bool unstake, address tokenOwner) internal returns (uint16 owed) { require(wndNFT.ownerOf(tokenId) == address(this), "Doesn't own token"); StakeWizard memory stake = training[tokenId]; require(tokenOwner == stake.owner, "Invalid token owner"); require(!(unstake && block.timestamp - stake.lastClaimTime < MINIMUM_TO_EXIT), "Still training"); while(stake.lastClaimTime > 0 && block.timestamp >= stake.lastClaimTime + timeToStakeForReward) { owed += 1; stake.lastClaimTime += timeToStakeForReward; } if (unstake) { address recipient = selectRecipient(seed, stake.owner); if(tokenId <= 15000) { // Don't allow gen0 tokens from being stolen recipient = stake.owner; } delete training[tokenId]; numWizardsStaked -= 1; _deposits[stake.owner].trainingWizards.remove(tokenId); // Always transfer last to guard against reentrance // recipient may not be the stake.owner if it was stolen by a random dragon. wndNFT.safeTransferFrom(address(this), recipient, tokenId, ""); // send back Wizard } else { training[tokenId] = StakeWizard({ owner: stake.owner, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp) }); // reset stake } emit WizardClaimed(tokenOwner, tokenId, unstake); } /** * realize $GP earnings for a single Dragon and optionally unstake it * Dragons earn $GP proportional to their rank * @param tokenId the ID of the Dragon to claim earnings from * @param unstake whether or not to unstake the Dragon */ function _claimDragonFromFlight(uint256 tokenId, bool unstake, address tokenOwner) internal returns (uint256 owedGP, uint16 owedRunes) { require(wndNFT.ownerOf(tokenId) == address(this), "Doesn't own token"); uint8 rank = _rankForDragon(tokenId); StakeDragon memory stake = flight[rank][flightIndices[tokenId]]; require(tokenOwner == stake.owner, "Invalid token owner"); owedGP = (rank) * (gpPerRank - stake.value); // Calculate portion of tokens based on Rank while(stake.lastClaimTime > 0 && block.timestamp >= stake.lastClaimTime + timeToStakeForReward) { owedRunes += 1; stake.lastClaimTime += timeToStakeForReward; } if (unstake) { totalRankStaked -= rank; // Remove rank from total staked StakeDragon memory lastStake = flight[rank][flight[rank].length - 1]; flight[rank][flightIndices[tokenId]] = lastStake; // Shuffle last Dragon to current position flightIndices[lastStake.tokenId] = flightIndices[tokenId]; flight[rank].pop(); // Remove duplicate delete flightIndices[tokenId]; // Delete old mapping _deposits[stake.owner].dragons.remove(tokenId); // Always remove last to guard against reentrance wndNFT.safeTransferFrom(address(this), stake.owner, tokenId, ""); // Send back Dragon } else { flight[rank][flightIndices[tokenId]] = StakeDragon({ owner: stake.owner, tokenId: uint16(tokenId), lastClaimTime: uint80(block.timestamp), value: gpPerRank }); // reset stake } emit DragonClaimed(stake.owner, tokenId, unstake); } /** * emergency unstake tokens * @param tokenIds the IDs of the tokens to claim earnings from */ function rescue(uint256[] calldata tokenIds) external nonReentrant { require(rescueEnabled, "RESCUE DISABLED"); uint256 tokenId; uint8 rank; for (uint i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; if (wndNFT.isWizard(tokenId)) { StakeWizard memory stake = tower[tokenId]; StakeWizard memory stakeTraining = training[tokenId]; require(stake.owner == tx.origin || stakeTraining.owner == tx.origin, "SWIPER, NO SWIPING"); if(stake.owner == tx.origin) { // guarding the tower delete tower[tokenId]; _deposits[stake.owner].towerWizards.remove(tokenId); } else { // training delete training[tokenId]; _deposits[stake.owner].trainingWizards.remove(tokenId); } numWizardsStaked -= 1; wndNFT.safeTransferFrom(address(this), tx.origin, tokenId, ""); // send back Wizards emit WizardClaimed(tx.origin, tokenId, true); } else { rank = _rankForDragon(tokenId); StakeDragon memory stake = flight[rank][flightIndices[tokenId]]; require(stake.owner == tx.origin, "SWIPER, NO SWIPING"); totalRankStaked -= rank; // Remove Rank from total staked StakeDragon memory lastStake = flight[rank][flight[rank].length - 1]; flight[rank][flightIndices[tokenId]] = lastStake; // Shuffle last Dragon to current position flightIndices[lastStake.tokenId] = flightIndices[tokenId]; flight[rank].pop(); // Remove duplicate delete flightIndices[tokenId]; // Delete old mapping _deposits[stake.owner].dragons.remove(tokenId); wndNFT.safeTransferFrom(address(this), tx.origin, tokenId, ""); // Send back Dragon emit DragonClaimed(tx.origin, tokenId, true); } } } /** ADMIN */ /** * allows owner to enable "rescue mode" * simplifies accounting, prioritizes tokens out in emergency */ function setRescueEnabled(bool _enabled) external onlyOwner { rescueEnabled = _enabled; } /** * enables owner to pause / unpause contract */ function setPaused(bool _paused) external requireContractsSet onlyOwner { if (_paused) _pause(); else _unpause(); } /** READ ONLY */ /** * gets the rank score for a Dragon * @param tokenId the ID of the Dragon to get the rank score for * @return the rank score of the Dragon (5-8) */ function _rankForDragon(uint256 tokenId) internal view returns (uint8) { IWnD.WizardDragon memory s = wndNFT.getTokenTraits(tokenId); return MAX_RANK - s.rankIndex; // rank index is 0-3 } /** * chooses a random Dragon thief when a newly minted token is stolen * @param seed a random value to choose a Dragon from * @return the owner of the randomly selected Dragon thief */ function randomDragonOwner(uint256 seed) public view override returns (address) { if (totalRankStaked == 0) { return address(0x0); } uint256 bucket = (seed & 0xFFFFFFFF) % totalRankStaked; // choose a value from 0 to total rank staked uint256 cumulative; seed >>= 32; // loop through each bucket of Dragons with the same rank score for (uint i = MAX_RANK - 3; i <= MAX_RANK; i++) { cumulative += flight[i].length * i; // if the value is not inside of that bucket, keep going if (bucket >= cumulative) continue; // get the address of a random Dragon with that rank score return flight[i][seed % flight[i].length].owner; } return address(0x0); } /** Deterministically random. This assumes the call was a part of commit+reveal design * that disallowed the benefactor of this outcome to make this call */ function random(uint16 tokenId, uint80 lastClaim, address owner) internal view returns (uint256) { return uint256(keccak256(abi.encodePacked( tx.origin, blockhash(block.number - 1), owner, tokenId, lastClaim ))); } function onERC721Received( address, address from, uint256, bytes calldata ) external pure override returns (bytes4) { require(from == address(0x0), "Cannot send to Tower directly"); return IERC721Receiver.onERC721Received.selector; } /** * enables an address to mint / burn * @param addr the address to enable */ function addAdmin(address addr) external onlyOwner { admins[addr] = true; } /** * disables an address from minting / burning * @param addr the address to disbale */ function removeAdmin(address addr) external onlyOwner { admins[addr] = false; } /** * add $GP to claimable pot for the Flight * @param amount $GP to add to the pot */ function _payDragonTax(uint256 amount) internal { if (totalRankStaked == 0) { // if there's no staked dragons unaccountedRewards += amount; // keep track of $GP due to dragons return; } // makes sure to include any unaccounted $GP gpPerRank += (amount + unaccountedRewards) / totalRankStaked; unaccountedRewards = 0; } modifier _updateEarnings() { if (totalGPEarned < MAXIMUM_GLOBAL_GP) { totalGPEarned += (block.timestamp - lastClaimTimestamp) * numWizardsStaked * DAILY_GP_RATE / 1 days; lastClaimTimestamp = block.timestamp; } _; } }
// SPDX-License-Identifier: MIT 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT 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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; interface IWnD is IERC721Enumerable { // game data storage struct WizardDragon { bool isWizard; uint8 body; uint8 head; uint8 spell; uint8 eyes; uint8 neck; uint8 mouth; uint8 wand; uint8 tail; uint8 rankIndex; } function minted() external returns (uint16); function updateOriginAccess(uint16[] memory tokenIds) external; function mint(address recipient, uint256 seed) external; function burn(uint256 tokenId) external; function getMaxTokens() external view returns (uint256); function getPaidTokens() external view returns (uint256); function getTokenTraits(uint256 tokenId) external view returns (WizardDragon memory); function getTokenWriteBlock(uint256 tokenId) external view returns(uint64); function isWizard(uint256 tokenId) external view returns(bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IGP { function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function updateOriginAccess() external; function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface ITrainingGrounds { function addManyToTowerAndFlight(address tokenOwner, uint16[] calldata tokenIds) external; function claimManyFromTowerAndFlight(address tokenOwner, uint16[] calldata tokenIds, bool unstake) external; function addManyToTrainingAndFlight(uint256 seed, address tokenOwner, uint16[] calldata tokenIds) external; function claimManyFromTrainingAndFlight(uint256 seed, address tokenOwner, uint16[] calldata tokenIds, bool unstake) external; function randomDragonOwner(uint256 seed) external view returns (address); function isTokenStaked(uint256 tokenId, bool isTraining) external view returns (bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface ISacrificialAlter { function mint(uint256 typeId, uint16 qty, address recipient) external; function burn(uint256 typeId, uint16 qty, address burnFrom) external; function updateOriginAccess() external; function balanceOf(address account, uint256 id) external returns (uint256); function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external; }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(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 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 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 tokenId); /** * @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 pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"}],"name":"DragonClaimed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"isWizard","type":"bool"},{"indexed":false,"internalType":"bool","name":"isTraining","type":"bool"}],"name":"TokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"}],"name":"WizardClaimed","type":"event"},{"inputs":[],"name":"DAILY_GP_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GP_CLAIM_TAX_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GP_CLAIM_TAX_PERCENTAGE_UNTRAINED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_GLOBAL_GP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MAGIC_RUNE_EMISSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RANK","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHIP_EMISSION","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_TO_EXIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyToTowerAndFlight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"addManyToTrainingAndFlight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alter","outputs":[{"internalType":"contract ISacrificialAlter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateErcEmissionRewards","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateGpRewards","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyFromTowerAndFlight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyFromTrainingAndFlight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"curMagicRunesEmitted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curWhipsEmitted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"depositsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gpToken","outputs":[{"internalType":"contract IGP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isTraining","type":"bool"}],"name":"isTokenStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"magicRune","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownsToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"randomDragonOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wndNFT","type":"address"},{"internalType":"address","name":"_gp","type":"address"},{"internalType":"address","name":"_alter","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setRescueEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeToStakeForReward","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGPEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wndNFT","outputs":[{"internalType":"contract IWnD","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000600e819055600f556012805460ff191690553480156200002557600080fd5b5062000031336200004f565b600180556002805460ff19169055620000496200009f565b6200013d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025460ff1615620000ea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001203390565b6040516001600160a01b03909116815260200160405180910390a1565b614fbd806200014d6000396000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c80636f7bb00a1161013b578063b3066d49116100b8578063f04d65fd1161007c578063f04d65fd146104e4578063f2eea45c146104f7578063f2fde38b1461050a578063f60378a71461051d578063f8b2a46e1461053057600080fd5b8063b3066d491461048d578063c1a11955146104a0578063ce6c1218146104a9578063d121e765146104b1578063e3a9db1a146104c457600080fd5b80638da5cb5b116100ff5780638da5cb5b146104275780639e3bcb8d14610438578063a2f47a6614610452578063a58407a214610462578063a64633861461048457600080fd5b80636f7bb00a146103bb57806370480275146103e6578063715018a6146103f957806376531008146104015780638336a6cf1461041457600080fd5b80631d596f20116101c9578063471199f01161018d578063471199f01461036457806351310f10146103775780635c975abb1461038a57806362bd92ae146103955780636a3ef057146103a857600080fd5b80631d596f20146103045780632a4278881461031757806337a386b91461032a57806339db714f146103345780633e6bca071461035157600080fd5b8063150b7a0211610210578063150b7a02146102a257806316c38b3c146102ce5780631785f53c146102e157806317fd7d16146102f45780631b1b5935146102fc57600080fd5b8062d0aa5114610241578063053058751461025c5780630780bfd4146102655780630b3eb6711461028d575b600080fd5b610249603281565b6040519081526020015b60405180910390f35b61024960105481565b60025461027a906301000000900461ffff1681565b60405161ffff9091168152602001610253565b6102a061029b366004614b58565b610543565b005b6102b56102b036600461481f565b610a04565b6040516001600160e01b03199091168152602001610253565b6102a06102dc3660046149ae565b610a6f565b6102a06102ef36600461479d565b610b2c565b610249600781565b610249600681565b6102a0610312366004614aff565b610b77565b610249610325366004614acf565b611029565b6102496202a30081565b6012546103419060ff1681565b6040519015158152602001610253565b6102a061035f36600461490a565b6113cc565b610341610372366004614bc9565b611810565b60025461027a90610100900461ffff1681565b60025460ff16610341565b6102a06103a33660046148b8565b611a19565b6102a06103b636600461496f565b611e73565b6007546103ce906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102a06103f436600461479d565b612555565b6102a06125a3565b6102a061040f3660046149ae565b6125d9565b6103ce610422366004614acf565b612616565b6000546001600160a01b03166103ce565b610440600881565b60405160ff9091168152602001610253565b610249686c6b935b8bbd40000081565b61046c6202a30081565b6040516001600160501b039091168152602001610253565b61027a613e8081565b6102a061049b3660046147d5565b612718565b61027a61064081565b610249601481565b6102496b019d971e4fe8401e7400000081565b6104d76104d236600461479d565b612781565b6040516102539190614c79565b6103416104f2366004614acf565b612980565b6008546103ce906001600160a01b031681565b6102a061051836600461479d565b612b7e565b61024961052b366004614acf565b612c16565b6006546103ce906001600160a01b031681565b60025460ff161561056f5760405162461bcd60e51b815260040161056690614d42565b60405180910390fd5b600260015414156105925760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff166105c65760405162461bcd60e51b815260040161056690614d13565b6000806000805b8581101561075f576006546001600160a01b031663ff53f47388888481811061060657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061061b9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d91906149ca565b156106e7576106d6898888848181106106b657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106cb9190614aad565b61ffff16878b612ff7565b6106e09084614e3c565b925061074d565b60008061072d89898581811061070d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107229190614aad565b61ffff16888c613397565b909250905061073c8287614e62565b95506107488185614e3c565b935050505b8061075781614f09565b9150506105cd565b50600760009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107b057600080fd5b505af11580156107c4573d6000803e3d6000fd5b505050506000831115610838576007546040516340c10f1960e01b81526001600160a01b03898116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b15801561081f57600080fd5b505af1158015610833573d6000803e3d6000fd5b505050505b60008261ffff161180156108695750600254613e8090610862908490610100900461ffff16614e3c565b61ffff1611155b156109165781600260018282829054906101000a900461ffff1661088d9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526006600482015291851660248301526001600160a01b038a81166044840152169150635141601990606401600060405180830381600087803b1580156108fd57600080fd5b505af1158015610911573d6000803e3d6000fd5b505050505b60008161ffff161180156109495750600254610640906109429083906301000000900461ffff16614e3c565b61ffff1611155b156109f65780600260038282829054906101000a900461ffff1661096d9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526007600482015291841660248301526001600160a01b038a81166044840152169150635141601990606401600060405180830381600087803b1580156109dd57600080fd5b505af11580156109f1573d6000803e3d6000fd5b505050505b505060018055505050505050565b60006001600160a01b03851615610a5d5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f742073656e6420746f20546f776572206469726563746c790000006044820152606401610566565b50630a85bd0160e11b95945050505050565b6006546001600160a01b031615801590610a9357506007546001600160a01b031615155b8015610aa957506008546001600160a01b031615155b610ae95760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b6044820152606401610566565b6000546001600160a01b03163314610b135760405162461bcd60e51b815260040161056690614d6c565b8015610b2457610b21613951565b50565b610b216139c6565b6000546001600160a01b03163314610b565760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b03166000908152600360205260409020805460ff19169055565b60026001541415610b9a5760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff16610bce5760405162461bcd60e51b815260040161056690614d13565b60005b8181101561101e576006546001600160a01b038086169116636352211e858585818110610c0e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c239190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015610c5d57600080fd5b505afa158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9591906147b9565b6001600160a01b031614610ce65760405162461bcd60e51b81526020600482015260186024820152772cb7ba903237b713ba1037bbb7103a3434b9903a37b5b2b760411b6044820152606401610566565b6040516001600160601b03193260601b166020820152603481018690526054016040516020818303038152906040528051906020012060001c94506000610d2d8686613a40565b9050613a98848484818110610d5257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d679190614aad565b61ffff1611610d735750835b846001600160a01b0316816001600160a01b031614610e2a576006546001600160a01b03166323b872dd8683878787818110610dbf57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610dd49190614aad565b6040518463ffffffff1660e01b8152600401610df293929190614c1f565b600060405180830381600087803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b505050505061100c565b6006546001600160a01b03166323b872dd8630878787818110610e5d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e729190614aad565b6040518463ffffffff1660e01b8152600401610e9093929190614c1f565b600060405180830381600087803b158015610eaa57600080fd5b505af1158015610ebe573d6000803e3d6000fd5b50506006546001600160a01b0316915063ff53f4739050858585818110610ef557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f0a9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015610f4457600080fd5b505afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c91906149ca565b15610fc857610fc381858585818110610fa557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fba9190614aad565b61ffff16613a8c565b61100a565b61100a81858585818110610fec57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110019190614aad565b61ffff16613bb7565b505b8061101681614f09565b915050610bd1565b505060018055505050565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b15801561107257600080fd5b505afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190614bf8565b905043816001600160401b0316106110d45760405162461bcd60e51b815260040161056690614ce8565b600654604051600162ac0b8d60e01b03198152600481018590526001600160a01b039091169063ff53f4739060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906149ca565b156112a8576000838152600960209081526040918290208251606081018452905461ffff811682526201000081046001600160501b031692820192909252600160601b9091046001600160a01b0316918101829052906111ea5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f74206775617264696e6760701b6044820152606401610566565b6b019d971e4fe8401e7400000060105410156112425762015180686c6b935b8bbd40000082602001516001600160501b0316426112279190614ecf565b6112319190614eb0565b61123b9190614e9c565b92506112a2565b60115481602001516001600160501b0316111561126257600092506112a2565b62015180686c6b935b8bbd40000082602001516001600160501b031660115461128b9190614ecf565b6112959190614eb0565b61129f9190614e9c565b92505b506113c6565b60006112b384613cfc565b90506000600b60008360ff168152602001908152602001600020600c600087815260200190815260200160002054815481106112ff57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b0316908201819052600190920154606082015291506113a25760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd081a5b88199b1a59da1d606a1b6044820152606401610566565b8060600151600f546113b49190614ecf565b6113c19060ff8416614eb0565b935050505b50919050565b60025460ff16156113ef5760405162461bcd60e51b815260040161056690614d42565b6b019d971e4fe8401e74000000601054101561145d5762015180686c6b935b8bbd400000600554601154426114249190614ecf565b61142e9190614eb0565b6114389190614eb0565b6114429190614e9c565b601060008282546114539190614e62565b9091555050426011555b600260015414156114805760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff166114b45760405162461bcd60e51b815260040161056690614d13565b60008060005b8481101561164b576006546001600160a01b031663ff53f4738787848181106114f357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115089190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906149ca565b156115d3576115c28686838181106115a257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115b79190614aad565b61ffff168589613d92565b6115cc9084614e62565b9250611639565b6000806116198888858181106115f957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061160e9190614aad565b61ffff16878b613397565b90925090506116288286614e62565b94506116348185614e3c565b935050505b8061164381614f09565b9150506114ba565b50600760009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561169c57600080fd5b505af11580156116b0573d6000803e3d6000fd5b505050506000821115611724576007546040516340c10f1960e01b81526001600160a01b03888116600483015260248201859052909116906340c10f1990604401600060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050505b60008161ffff161180156117575750600254610640906117509083906301000000900461ffff16614e3c565b61ffff1611155b156118045780600260038282829054906101000a900461ffff1661177b9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526007600482015291841660248301526001600160a01b038981166044840152169150635141601990606401600060405180830381600087803b1580156117eb57600080fd5b505af11580156117ff573d6000803e3d6000fd5b505050505b50506001805550505050565b600654604051631d7a2e6d60e31b81526004810184905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b15801561185957600080fd5b505afa15801561186d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118919190614bf8565b905043816001600160401b0316106118bb5760405162461bcd60e51b815260040161056690614ce8565b6006546040516394e5684760e01b8152600481018690526000916001600160a01b0316906394e56847906024016101406040518083038186803b15801561190157600080fd5b505afa158015611915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193991906149e6565b805190915015611999578361196e57600085815260096020526040902054600160601b90046001600160a01b03161515611990565b6000858152600a6020526040902054600160601b90046001600160a01b031615155b92505050611a13565b60006119a486613cfc565b60ff81166000908152600b602090815260408083208a8452600c9092528220548154939450919290919081106119ea57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b0316141593505050505b92915050565b60026001541415611a3c5760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff16611a705760405162461bcd60e51b815260040161056690614d13565b60005b81811015611e695760065430906001600160a01b0316636352211e858585818110611aae57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ac39190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611afd57600080fd5b505afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3591906147b9565b6001600160a01b031614611ced576006546001600160a01b038086169116636352211e858585818110611b7857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b8d9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611bc757600080fd5b505afa158015611bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bff91906147b9565b6001600160a01b031614611c505760405162461bcd60e51b81526020600482015260186024820152772cb7ba903237b713ba1037bbb7103a3434b9903a37b5b2b760411b6044820152606401610566565b6006546001600160a01b03166323b872dd8530868686818110611c8357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c989190614aad565b6040518463ffffffff1660e01b8152600401611cb693929190614c1f565b600060405180830381600087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b50505050611d2f565b828282818110611d0d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d229190614aad565b61ffff16611d2f57611e57565b6006546001600160a01b031663ff53f473848484818110611d6057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d759190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611daf57600080fd5b505afa158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de791906149ca565b15611e3357611e2e84848484818110611e1057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e259190614aad565b61ffff166141ec565b611e57565b611e5784848484818110610fec57634e487b7160e01b600052603260045260246000fd5b80611e6181614f09565b915050611a73565b5050600180555050565b60026001541415611e965760405162461bcd60e51b815260040161056690614dce565b600260015560125460ff16611edf5760405162461bcd60e51b815260206004820152600f60248201526e149154d0d55148111254d050931151608a1b6044820152606401610566565b60008060005b8381101561101e57848482818110611f0d57634e487b7160e01b600052603260045260246000fd5b600654604051600162ac0b8d60e01b0319815260209290920293909301356004820181905295506001600160a01b039092169163ff53f473915060240160206040518083038186803b158015611f6257600080fd5b505afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a91906149ca565b156121bd576000838152600960209081526040808320815160608082018452915461ffff80821683526001600160501b03620100008084048216858901526001600160a01b03600160601b9485900481168689019081528d8b52600a8a529988902088519788018952549384168752908304909116968501969096520484169282019290925292519092911632148061203f575060408101516001600160a01b031632145b6120805760405162461bcd60e51b81526020600482015260126024820152715357495045522c204e4f2053574950494e4760701b6044820152606401610566565b60408201516001600160a01b03163214156120cf576000858152600960209081526040808320839055848101516001600160a01b03168352600d90915290206120c9908661430d565b50612108565b6000858152600a60209081526040808320839055848101516001600160a01b03168352600d9091529020612106906002018661430d565b505b60016005600082825461211b9190614ecf565b9091555050600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde9061215490309032908a90600401614c46565b600060405180830381600087803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50506040516001925087915032907f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e490600090a45050612543565b6121c683613cfc565b91506000600b60008460ff168152602001908152602001600020600c6000868152602001908152602001600020548154811061221257634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b03169082018190526001909201546060820152915032146122b65760405162461bcd60e51b81526020600482015260126024820152715357495045522c204e4f2053574950494e4760701b6044820152606401610566565b8260ff16600460008282546122cb9190614ecf565b909155505060ff83166000908152600b6020526040812080546122f090600190614ecf565b8154811061230e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526002909402909101805461ffff811685526001600160501b0362010000820416858501526001600160a01b03600160601b909104168483015260010154606084015260ff88168452600b8252808420898552600c90925290922054825491935083929181106123a157634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516002909302018054858301516040808801516001600160a01b0316600160601b026001600160601b036001600160501b0390931662010000026001600160601b031990941661ffff978816179390931791909116919091178255606090950151600190910155888352600c815283832054855190921683528383209190915560ff87168252600b90522080548061245457634e487b7160e01b600052603160045260246000fd5b6000828152602080822060026000199094019384020182815560010182905591909255868252600c81526040808320839055848101516001600160a01b03168352600d90915290206124a9906004018661430d565b50600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde906124de90309032908a90600401614c46565b600060405180830381600087803b1580156124f857600080fd5b505af115801561250c573d6000803e3d6000fd5b50506040516001925087915032907f05c665cd73b2f7e81169662803bd83af7b10deb95e709060f3f6057239fc45cb90600090a450505b8061254d81614f09565b915050611ee5565b6000546001600160a01b0316331461257f5760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146125cd5760405162461bcd60e51b815260040161056690614d6c565b6125d76000614319565b565b6000546001600160a01b031633146126035760405162461bcd60e51b815260040161056690614d6c565b6012805460ff1916911515919091179055565b60006004546000141561262b57506000919050565b60006004548363ffffffff166126419190614f24565b60209390931c92905060008061265960036008614ee6565b60ff1690505b6008811161270d576000818152600b6020526040902054612681908290614eb0565b61268b9083614e62565b9150818310612699576126fb565b6000818152600b6020526040902080546126b39087614f24565b815481106126d157634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b031695945050505050565b8061270581614f09565b91505061265f565b506000949350505050565b6000546001600160a01b031633146127425760405162461bcd60e51b815260040161056690614d6c565b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b6001600160a01b0381166000908152600d602052604081206060916127a860048301614369565b6127b483600201614369565b6127bd84614369565b6127c79190614e62565b6127d19190614e62565b6001600160401b038111156127f657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561281f578160200160208202803683370190505b50905060005b61282e83614369565b81101561287c5761283f8382614373565b82828151811061285f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061287481614f09565b915050612825565b5060005b61288c83600201614369565b8110156128ef576128a06002840182614373565b826128aa85614369565b6128b49084614e62565b815181106128d257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806128e781614f09565b915050612880565b5060005b6128ff83600401614369565b811015612978576129136004840182614373565b8261292085600201614369565b61292986614369565b6129339085614e62565b61293d9190614e62565b8151811061295b57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061297081614f09565b9150506128f3565b509392505050565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b1580156129c957600080fd5b505afa1580156129dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a019190614bf8565b905043816001600160401b031610612a2b5760405162461bcd60e51b815260040161056690614ce8565b6006546040516394e5684760e01b8152600481018590526000916001600160a01b0316906394e56847906024016101406040518083038186803b158015612a7157600080fd5b505afa158015612a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa991906149e6565b805190915015612b0457600084815260096020526040902054600160601b90046001600160a01b0316321480612afc57506000848152600a6020526040902054600160601b90046001600160a01b031632145b949350505050565b6000612b0f85613cfc565b60ff81166000908152600b60209081526040808320898452600c90925290912054815492935032928110612b5357634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b03161495945050505050565b6000546001600160a01b03163314612ba85760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b038116612c0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610566565b610b2181614319565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b158015612c5f57600080fd5b505afa158015612c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c979190614bf8565b905043816001600160401b031610612cc15760405162461bcd60e51b815260040161056690614ce8565b600654604051600162ac0b8d60e01b03198152600481018590526001600160a01b039091169063ff53f4739060240160206040518083038186803b158015612d0857600080fd5b505afa158015612d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4091906149ca565b15612e6557600254613e8061010090910461ffff1610612d635750600092915050565b6000838152600a60209081526040918290208251606081018452905461ffff811682526201000081046001600160501b031692820192909252600160601b9091046001600160a01b031691810182905290612df55760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420747261696e696e6760701b6044820152606401610566565b600081602001516001600160501b0316118015612e2d57506202a3008160200151612e209190614e7a565b6001600160501b03164210155b156112a257612e3d600184614e62565b92506202a30081602001818151612e549190614e7a565b6001600160501b0316905250612df5565b600254610640630100000090910461ffff1610612e855750600092915050565b6000612e9084613cfc565b90506000600b60008360ff168152602001908152602001600020600c60008781526020019081526020016000205481548110612edc57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b031690820181905260019092015460608201529150612f7f5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd081a5b88199b1a59da1d606a1b6044820152606401610566565b600081602001516001600160501b0316118015612fb757506202a3008160200151612faa9190614e7a565b6001600160501b03164210155b15612fef57612fc7600185614e62565b93506202a30081602001818151612fde9190614e7a565b6001600160501b0316905250612f7f565b505050919050565b6006546040516331a9108f60e11b81526004810185905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561304057600080fd5b505afa158015613054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307891906147b9565b6001600160a01b03161461309e5760405162461bcd60e51b815260040161056690614cbd565b6000848152600a60209081526040918290208251606081018452905461ffff811682526001600160501b0362010000820416928201929092526001600160a01b03600160601b909204821692810183905291908416146131105760405162461bcd60e51b815260040161056690614da1565b83801561313757506202a30081602001516001600160501b0316426131359190614ecf565b105b156131755760405162461bcd60e51b815260206004820152600e60248201526d5374696c6c20747261696e696e6760901b6044820152606401610566565b600081602001516001600160501b03161180156131ad57506202a30081602001516131a09190614e7a565b6001600160501b03164210155b156131e5576131bd600183614e3c565b91506202a300816020018181516131d49190614e7a565b6001600160501b0316905250613175565b83156132ca5760006131fb878360400151613a40565b9050613a98861161320d575060408101515b6000868152600a602052604081208190556005805460019290613231908490614ecf565b90915550506040808301516001600160a01b03166000908152600d6020522061325d906002018761430d565b50600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde9061329290309085908b90600401614c46565b600060405180830381600087803b1580156132ac57600080fd5b505af11580156132c0573d6000803e3d6000fd5b5050505050613354565b6040805160608101825261ffff8781168252426001600160501b039081166020808501918252868601516001600160a01b0390811686880190815260008d8152600a90935296909120945185549251965194166001600160601b031990921691909117620100009590921694909402176001600160601b0316600160601b91909316029190911790555b83151585846001600160a01b03167f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e460405160405180910390a450949350505050565b6006546040516331a9108f60e11b815260048101859052600091829130916001600160a01b031690636352211e9060240160206040518083038186803b1580156133e057600080fd5b505afa1580156133f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341891906147b9565b6001600160a01b03161461343e5760405162461bcd60e51b815260040161056690614cbd565b600061344986613cfc565b90506000600b60008360ff168152602001908152602001600020600c6000898152602001908152602001600020548154811061349557634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516080810182526002909302909101805461ffff811684526001600160501b0362010000820416948401949094526001600160a01b03600160601b9094048416918301829052600101546060830152909250908616146135155760405162461bcd60e51b815260040161056690614da1565b8060600151600f546135279190614ecf565b6135349060ff8416614eb0565b93505b600081602001516001600160501b031611801561356f57506202a30081602001516135629190614e7a565b6001600160501b03164210155b156135a75761357f600184614e3c565b92506202a300816020018181516135969190614e7a565b6001600160501b0316905250613537565b8515613811578160ff16600460008282546135c29190614ecf565b909155505060ff82166000908152600b6020526040812080546135e790600190614ecf565b8154811061360557634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526002909402909101805461ffff811685526001600160501b0362010000820416858501526001600160a01b03600160601b909104168483015260010154606084015260ff87168452600b82528084208c8552600c909252909220548254919350839291811061369857634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516002909302018054858301516040808801516001600160a01b0316600160601b026001600160601b036001600160501b0390931662010000026001600160601b031990941661ffff9788161793909317919091169190911782556060909501516001909101558b8352600c815283832054855190921683528383209190915560ff86168252600b90522080548061374b57634e487b7160e01b600052603160045260246000fd5b6000828152602080822060026000199094019384020182815560010182905591909255898252600c81526040808320839055848101516001600160a01b03168352600d90915290206137a0906004018961430d565b506006546040808401519051635c46a7ef60e11b81526001600160a01b039092169163b88d4fde916137d9913091908d90600401614c46565b600060405180830381600087803b1580156137f357600080fd5b505af1158015613807573d6000803e3d6000fd5b5050505050613909565b60405180608001604052808861ffff168152602001426001600160501b0316815260200182604001516001600160a01b03168152602001600f54815250600b60008460ff168152602001908152602001600020600c60008a8152602001908152602001600020548154811061389657634e487b7160e01b600052603260045260246000fd5b6000918252602091829020835160029092020180549284015160408501516001600160a01b0316600160601b026001600160601b036001600160501b0390921662010000026001600160601b031990951661ffff9094169390931793909317929092161781556060909101516001909101555b8515158782604001516001600160a01b03167f05c665cd73b2f7e81169662803bd83af7b10deb95e709060f3f6057239fc45cb60405160405180910390a45050935093915050565b60025460ff16156139745760405162461bcd60e51b815260040161056690614d42565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586139a93390565b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff16613a0f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610566565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336139a9565b6000613a51600a60f585901c614f24565b15613a5d575080611a13565b6000613a6c609085901c612616565b90506001600160a01b038116613a855782915050611a13565b9392505050565b60025460ff1615613aaf5760405162461bcd60e51b815260040161056690614d42565b6040805160608101825261ffff80841682526001600160501b0342811660208085019182526001600160a01b038089168688019081526000898152600a9093529682209551865493519751909116600160601b026001600160601b039790941662010000026001600160601b031990931694169390931717939093169290921790556005805460019290613b44908490614e62565b90915550506001600160a01b0382166000908152600d60205260409020613b6e906002018261437f565b5060405160018082529082906001600160a01b038516907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb50906020015b60405180910390a45050565b6000613bc282613cfc565b90508060ff1660046000828254613bd99190614e62565b909155505060ff81166000908152600b602081815260408084208054878652600c8452828620819055938352815160808101835261ffff80891682526001600160501b034281168387019081526001600160a01b03808d16858801818152600f54606088019081526001808d018a55988d528a8d2097516002909c02909701805494519151909316600160601b026001600160601b039190951662010000026001600160601b03199094169a9095169990991791909117929092161781559051910155918352600d90529020613cb2906004018361437f565b506040516001815260009083906001600160a01b038616907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb509060200160405180910390a4505050565b6006546040516394e5684760e01b81526004810183905260009182916001600160a01b03909116906394e56847906024016101406040518083038186803b158015613d4657600080fd5b505afa158015613d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d7e91906149e6565b90508061012001516008613a859190614ee6565b6006546040516331a9108f60e11b81526004810185905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b158015613ddb57600080fd5b505afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1391906147b9565b6001600160a01b031614613e395760405162461bcd60e51b815260040161056690614cbd565b6000848152600960209081526040918290208251606081018452905461ffff811682526001600160501b0362010000820416928201929092526001600160a01b03600160601b90920482169281018390529190841614613eab5760405162461bcd60e51b815260040161056690614da1565b838015613ed257506202a30081602001516001600160501b031642613ed09190614ecf565b105b15613f1f5760405162461bcd60e51b815260206004820152601860248201527f5374696c6c206775617264696e672074686520746f77657200000000000000006044820152606401610566565b6b019d971e4fe8401e740000006010541015613f775762015180686c6b935b8bbd40000082602001516001600160501b031642613f5c9190614ecf565b613f669190614eb0565b613f709190614e9c565b9150613fd7565b60115481602001516001600160501b03161115613f975760009150613fd7565b62015180686c6b935b8bbd40000082602001516001600160501b0316601154613fc09190614ecf565b613fca9190614eb0565b613fd49190614e9c565b91505b83156140ca57613ff481600001518260200151836040015161438b565b6001166001141561400d576140088261440d565b600091505b60008581526009602052604081208190556005805460019290614031908490614ecf565b90915550506040808201516001600160a01b03166000908152600d6020522061405a908661430d565b506006546040808301519051635c46a7ef60e11b81526001600160a01b039092169163b88d4fde91614093913091908a90600401614c46565b600060405180830381600087803b1580156140ad57600080fd5b505af11580156140c1573d6000803e3d6000fd5b505050506141a6565b60006140d98260400151614466565b90506140f960646140ea8386614eb0565b6140f49190614e9c565b61440d565b60646141058282614ecf565b61410f9085614eb0565b6141199190614e9c565b6040805160608101825261ffff8981168252426001600160501b039081166020808501918252888601516001600160a01b0390811686880190815260008f8152600990935296909120945185549251965194166001600160601b031990921691909117620100009590921694909402176001600160601b0316600160601b91909316029190911790559250505b8315158582604001516001600160a01b03167f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e460405160405180910390a4509392505050565b60025460ff161561420f5760405162461bcd60e51b815260040161056690614d42565b6040805160608101825261ffff80841682526001600160501b0342811660208085019182526001600160a01b03808916868801908152600089815260099093529682209551865493519751909116600160601b026001600160601b039790941662010000026001600160601b0319909316941693909317179390931692909217905560058054600192906142a4908490614e62565b90915550506001600160a01b0382166000908152600d602052604090206142cb908261437f565b506040516000815260019082906001600160a01b038516907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb5090602001613bab565b6000613a85838361458f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611a13825490565b6000613a8583836146ac565b6000613a8583836146e4565b600032614399600143614ecf565b6040516001600160601b0319606093841b81166020830152914060348201529184901b1660548201526001600160f01b031960f086901b1660688201526001600160b01b031960b085901b16606a82015260740160408051601f198184030181529190528051602090910120949350505050565b60045461442e5780600e60008282546144269190614e62565b909155505050565b600454600e5461443e9083614e62565b6144489190614e9c565b600f60008282546144599190614e62565b90915550506000600e5550565b6001600160a01b0381166000908152600d60205260408120600a9061448a90614369565b1161452a57600854604051627eeac760e11b81526001600160a01b03848116600483015260066024830152600192169062fdd58e906044015b602060405180830381600087803b1580156144dd57600080fd5b505af11580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145159190614ae7565b1015614522576032611a13565b601492915050565b6001600160a01b0382166000908152600d60205260409020600a9061454e90614369565b6145589190614e9c565b600854604051627eeac760e11b81526001600160a01b038581166004830152600660248301529091169062fdd58e906044016144c3565b600081815260018301602052604081205480156146a25760006145b3600183614ecf565b85549091506000906145c790600190614ecf565b90508181146146485760008660000182815481106145f557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061462657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061466757634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611a13565b6000915050611a13565b60008260000182815481106146d157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205461472b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611a13565b506000611a13565b60008083601f840112614744578182fd5b5081356001600160401b0381111561475a578182fd5b6020830191508360208260051b850101111561477557600080fd5b9250929050565b805161478781614f79565b919050565b805160ff8116811461478757600080fd5b6000602082840312156147ae578081fd5b8135613a8581614f64565b6000602082840312156147ca578081fd5b8151613a8581614f64565b6000806000606084860312156147e9578182fd5b83356147f481614f64565b9250602084013561480481614f64565b9150604084013561481481614f64565b809150509250925092565b600080600080600060808688031215614836578081fd5b853561484181614f64565b9450602086013561485181614f64565b93506040860135925060608601356001600160401b0380821115614873578283fd5b818801915088601f830112614886578283fd5b813581811115614894578384fd5b8960208285010111156148a5578384fd5b9699959850939650602001949392505050565b6000806000604084860312156148cc578283fd5b83356148d781614f64565b925060208401356001600160401b038111156148f1578283fd5b6148fd86828701614733565b9497909650939450505050565b6000806000806060858703121561491f578384fd5b843561492a81614f64565b935060208501356001600160401b03811115614944578384fd5b61495087828801614733565b909450925050604085013561496481614f79565b939692955090935050565b60008060208385031215614981578182fd5b82356001600160401b03811115614996578283fd5b6149a285828601614733565b90969095509350505050565b6000602082840312156149bf578081fd5b8135613a8581614f79565b6000602082840312156149db578081fd5b8151613a8581614f79565b600061014082840312156149f8578081fd5b614a00614e05565b614a098361477c565b8152614a176020840161478c565b6020820152614a286040840161478c565b6040820152614a396060840161478c565b6060820152614a4a6080840161478c565b6080820152614a5b60a0840161478c565b60a0820152614a6c60c0840161478c565b60c0820152614a7d60e0840161478c565b60e0820152610100614a9081850161478c565b90820152610120614aa284820161478c565b908201529392505050565b600060208284031215614abe578081fd5b813561ffff81168114613a85578182fd5b600060208284031215614ae0578081fd5b5035919050565b600060208284031215614af8578081fd5b5051919050565b60008060008060608587031215614b14578182fd5b843593506020850135614b2681614f64565b925060408501356001600160401b03811115614b40578283fd5b614b4c87828801614733565b95989497509550505050565b600080600080600060808688031215614b6f578283fd5b853594506020860135614b8181614f64565b935060408601356001600160401b03811115614b9b578384fd5b614ba788828901614733565b9094509250506060860135614bbb81614f79565b809150509295509295909350565b60008060408385031215614bdb578182fd5b823591506020830135614bed81614f79565b809150509250929050565b600060208284031215614c09578081fd5b81516001600160401b0381168114613a85578182fd5b6001600160a01b03938416815291909216602082015261ffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6020808252825182820181905260009190848201906040850190845b81811015614cb157835183529284019291840191600101614c95565b50909695505050505050565b6020808252601190820152702237b2b9b713ba1037bbb7103a37b5b2b760791b604082015260600190565b602080825260119082015270686d6d6d6d207768617420646f696e673f60781b604082015260600190565b6020808252601590820152744f6e6c792061646d696e732063616e207374616b6560581b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527224b73b30b634b2103a37b5b2b71037bbb732b960691b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60405161014081016001600160401b0381118282101715614e3657634e487b7160e01b600052604160045260246000fd5b60405290565b600061ffff808316818516808303821115614e5957614e59614f38565b01949350505050565b60008219821115614e7557614e75614f38565b500190565b60006001600160501b03808316818516808303821115614e5957614e59614f38565b600082614eab57614eab614f4e565b500490565b6000816000190483118215151615614eca57614eca614f38565b500290565b600082821015614ee157614ee1614f38565b500390565b600060ff821660ff841680821015614f0057614f00614f38565b90039392505050565b6000600019821415614f1d57614f1d614f38565b5060010190565b600082614f3357614f33614f4e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610b2157600080fd5b8015158114610b2157600080fdfea2646970667358221220968e7e19933218b0fd7ae4c9eb0f1fd6b728433b02efcbe2253170e567ec7beb64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023c5760003560e01c80636f7bb00a1161013b578063b3066d49116100b8578063f04d65fd1161007c578063f04d65fd146104e4578063f2eea45c146104f7578063f2fde38b1461050a578063f60378a71461051d578063f8b2a46e1461053057600080fd5b8063b3066d491461048d578063c1a11955146104a0578063ce6c1218146104a9578063d121e765146104b1578063e3a9db1a146104c457600080fd5b80638da5cb5b116100ff5780638da5cb5b146104275780639e3bcb8d14610438578063a2f47a6614610452578063a58407a214610462578063a64633861461048457600080fd5b80636f7bb00a146103bb57806370480275146103e6578063715018a6146103f957806376531008146104015780638336a6cf1461041457600080fd5b80631d596f20116101c9578063471199f01161018d578063471199f01461036457806351310f10146103775780635c975abb1461038a57806362bd92ae146103955780636a3ef057146103a857600080fd5b80631d596f20146103045780632a4278881461031757806337a386b91461032a57806339db714f146103345780633e6bca071461035157600080fd5b8063150b7a0211610210578063150b7a02146102a257806316c38b3c146102ce5780631785f53c146102e157806317fd7d16146102f45780631b1b5935146102fc57600080fd5b8062d0aa5114610241578063053058751461025c5780630780bfd4146102655780630b3eb6711461028d575b600080fd5b610249603281565b6040519081526020015b60405180910390f35b61024960105481565b60025461027a906301000000900461ffff1681565b60405161ffff9091168152602001610253565b6102a061029b366004614b58565b610543565b005b6102b56102b036600461481f565b610a04565b6040516001600160e01b03199091168152602001610253565b6102a06102dc3660046149ae565b610a6f565b6102a06102ef36600461479d565b610b2c565b610249600781565b610249600681565b6102a0610312366004614aff565b610b77565b610249610325366004614acf565b611029565b6102496202a30081565b6012546103419060ff1681565b6040519015158152602001610253565b6102a061035f36600461490a565b6113cc565b610341610372366004614bc9565b611810565b60025461027a90610100900461ffff1681565b60025460ff16610341565b6102a06103a33660046148b8565b611a19565b6102a06103b636600461496f565b611e73565b6007546103ce906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102a06103f436600461479d565b612555565b6102a06125a3565b6102a061040f3660046149ae565b6125d9565b6103ce610422366004614acf565b612616565b6000546001600160a01b03166103ce565b610440600881565b60405160ff9091168152602001610253565b610249686c6b935b8bbd40000081565b61046c6202a30081565b6040516001600160501b039091168152602001610253565b61027a613e8081565b6102a061049b3660046147d5565b612718565b61027a61064081565b610249601481565b6102496b019d971e4fe8401e7400000081565b6104d76104d236600461479d565b612781565b6040516102539190614c79565b6103416104f2366004614acf565b612980565b6008546103ce906001600160a01b031681565b6102a061051836600461479d565b612b7e565b61024961052b366004614acf565b612c16565b6006546103ce906001600160a01b031681565b60025460ff161561056f5760405162461bcd60e51b815260040161056690614d42565b60405180910390fd5b600260015414156105925760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff166105c65760405162461bcd60e51b815260040161056690614d13565b6000806000805b8581101561075f576006546001600160a01b031663ff53f47388888481811061060657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061061b9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d91906149ca565b156106e7576106d6898888848181106106b657634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106cb9190614aad565b61ffff16878b612ff7565b6106e09084614e3c565b925061074d565b60008061072d89898581811061070d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107229190614aad565b61ffff16888c613397565b909250905061073c8287614e62565b95506107488185614e3c565b935050505b8061075781614f09565b9150506105cd565b50600760009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107b057600080fd5b505af11580156107c4573d6000803e3d6000fd5b505050506000831115610838576007546040516340c10f1960e01b81526001600160a01b03898116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b15801561081f57600080fd5b505af1158015610833573d6000803e3d6000fd5b505050505b60008261ffff161180156108695750600254613e8090610862908490610100900461ffff16614e3c565b61ffff1611155b156109165781600260018282829054906101000a900461ffff1661088d9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526006600482015291851660248301526001600160a01b038a81166044840152169150635141601990606401600060405180830381600087803b1580156108fd57600080fd5b505af1158015610911573d6000803e3d6000fd5b505050505b60008161ffff161180156109495750600254610640906109429083906301000000900461ffff16614e3c565b61ffff1611155b156109f65780600260038282829054906101000a900461ffff1661096d9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526007600482015291841660248301526001600160a01b038a81166044840152169150635141601990606401600060405180830381600087803b1580156109dd57600080fd5b505af11580156109f1573d6000803e3d6000fd5b505050505b505060018055505050505050565b60006001600160a01b03851615610a5d5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f742073656e6420746f20546f776572206469726563746c790000006044820152606401610566565b50630a85bd0160e11b95945050505050565b6006546001600160a01b031615801590610a9357506007546001600160a01b031615155b8015610aa957506008546001600160a01b031615155b610ae95760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b6044820152606401610566565b6000546001600160a01b03163314610b135760405162461bcd60e51b815260040161056690614d6c565b8015610b2457610b21613951565b50565b610b216139c6565b6000546001600160a01b03163314610b565760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b03166000908152600360205260409020805460ff19169055565b60026001541415610b9a5760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff16610bce5760405162461bcd60e51b815260040161056690614d13565b60005b8181101561101e576006546001600160a01b038086169116636352211e858585818110610c0e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c239190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015610c5d57600080fd5b505afa158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9591906147b9565b6001600160a01b031614610ce65760405162461bcd60e51b81526020600482015260186024820152772cb7ba903237b713ba1037bbb7103a3434b9903a37b5b2b760411b6044820152606401610566565b6040516001600160601b03193260601b166020820152603481018690526054016040516020818303038152906040528051906020012060001c94506000610d2d8686613a40565b9050613a98848484818110610d5257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d679190614aad565b61ffff1611610d735750835b846001600160a01b0316816001600160a01b031614610e2a576006546001600160a01b03166323b872dd8683878787818110610dbf57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610dd49190614aad565b6040518463ffffffff1660e01b8152600401610df293929190614c1f565b600060405180830381600087803b158015610e0c57600080fd5b505af1158015610e20573d6000803e3d6000fd5b505050505061100c565b6006546001600160a01b03166323b872dd8630878787818110610e5d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e729190614aad565b6040518463ffffffff1660e01b8152600401610e9093929190614c1f565b600060405180830381600087803b158015610eaa57600080fd5b505af1158015610ebe573d6000803e3d6000fd5b50506006546001600160a01b0316915063ff53f4739050858585818110610ef557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f0a9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015610f4457600080fd5b505afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c91906149ca565b15610fc857610fc381858585818110610fa557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fba9190614aad565b61ffff16613a8c565b61100a565b61100a81858585818110610fec57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110019190614aad565b61ffff16613bb7565b505b8061101681614f09565b915050610bd1565b505060018055505050565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b15801561107257600080fd5b505afa158015611086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110aa9190614bf8565b905043816001600160401b0316106110d45760405162461bcd60e51b815260040161056690614ce8565b600654604051600162ac0b8d60e01b03198152600481018590526001600160a01b039091169063ff53f4739060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906149ca565b156112a8576000838152600960209081526040918290208251606081018452905461ffff811682526201000081046001600160501b031692820192909252600160601b9091046001600160a01b0316918101829052906111ea5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f74206775617264696e6760701b6044820152606401610566565b6b019d971e4fe8401e7400000060105410156112425762015180686c6b935b8bbd40000082602001516001600160501b0316426112279190614ecf565b6112319190614eb0565b61123b9190614e9c565b92506112a2565b60115481602001516001600160501b0316111561126257600092506112a2565b62015180686c6b935b8bbd40000082602001516001600160501b031660115461128b9190614ecf565b6112959190614eb0565b61129f9190614e9c565b92505b506113c6565b60006112b384613cfc565b90506000600b60008360ff168152602001908152602001600020600c600087815260200190815260200160002054815481106112ff57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b0316908201819052600190920154606082015291506113a25760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd081a5b88199b1a59da1d606a1b6044820152606401610566565b8060600151600f546113b49190614ecf565b6113c19060ff8416614eb0565b935050505b50919050565b60025460ff16156113ef5760405162461bcd60e51b815260040161056690614d42565b6b019d971e4fe8401e74000000601054101561145d5762015180686c6b935b8bbd400000600554601154426114249190614ecf565b61142e9190614eb0565b6114389190614eb0565b6114429190614e9c565b601060008282546114539190614e62565b9091555050426011555b600260015414156114805760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff166114b45760405162461bcd60e51b815260040161056690614d13565b60008060005b8481101561164b576006546001600160a01b031663ff53f4738787848181106114f357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115089190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906149ca565b156115d3576115c28686838181106115a257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115b79190614aad565b61ffff168589613d92565b6115cc9084614e62565b9250611639565b6000806116198888858181106115f957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061160e9190614aad565b61ffff16878b613397565b90925090506116288286614e62565b94506116348185614e3c565b935050505b8061164381614f09565b9150506114ba565b50600760009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561169c57600080fd5b505af11580156116b0573d6000803e3d6000fd5b505050506000821115611724576007546040516340c10f1960e01b81526001600160a01b03888116600483015260248201859052909116906340c10f1990604401600060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050505b60008161ffff161180156117575750600254610640906117509083906301000000900461ffff16614e3c565b61ffff1611155b156118045780600260038282829054906101000a900461ffff1661177b9190614e3c565b82546101009290920a61ffff818102199093169183160217909155600854604051635141601960e01b81526007600482015291841660248301526001600160a01b038981166044840152169150635141601990606401600060405180830381600087803b1580156117eb57600080fd5b505af11580156117ff573d6000803e3d6000fd5b505050505b50506001805550505050565b600654604051631d7a2e6d60e31b81526004810184905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b15801561185957600080fd5b505afa15801561186d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118919190614bf8565b905043816001600160401b0316106118bb5760405162461bcd60e51b815260040161056690614ce8565b6006546040516394e5684760e01b8152600481018690526000916001600160a01b0316906394e56847906024016101406040518083038186803b15801561190157600080fd5b505afa158015611915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193991906149e6565b805190915015611999578361196e57600085815260096020526040902054600160601b90046001600160a01b03161515611990565b6000858152600a6020526040902054600160601b90046001600160a01b031615155b92505050611a13565b60006119a486613cfc565b60ff81166000908152600b602090815260408083208a8452600c9092528220548154939450919290919081106119ea57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b0316141593505050505b92915050565b60026001541415611a3c5760405162461bcd60e51b815260040161056690614dce565b60026001553360009081526003602052604090205460ff16611a705760405162461bcd60e51b815260040161056690614d13565b60005b81811015611e695760065430906001600160a01b0316636352211e858585818110611aae57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ac39190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611afd57600080fd5b505afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3591906147b9565b6001600160a01b031614611ced576006546001600160a01b038086169116636352211e858585818110611b7857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b8d9190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611bc757600080fd5b505afa158015611bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bff91906147b9565b6001600160a01b031614611c505760405162461bcd60e51b81526020600482015260186024820152772cb7ba903237b713ba1037bbb7103a3434b9903a37b5b2b760411b6044820152606401610566565b6006546001600160a01b03166323b872dd8530868686818110611c8357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c989190614aad565b6040518463ffffffff1660e01b8152600401611cb693929190614c1f565b600060405180830381600087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b50505050611d2f565b828282818110611d0d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d229190614aad565b61ffff16611d2f57611e57565b6006546001600160a01b031663ff53f473848484818110611d6057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d759190614aad565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b158015611daf57600080fd5b505afa158015611dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de791906149ca565b15611e3357611e2e84848484818110611e1057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e259190614aad565b61ffff166141ec565b611e57565b611e5784848484818110610fec57634e487b7160e01b600052603260045260246000fd5b80611e6181614f09565b915050611a73565b5050600180555050565b60026001541415611e965760405162461bcd60e51b815260040161056690614dce565b600260015560125460ff16611edf5760405162461bcd60e51b815260206004820152600f60248201526e149154d0d55148111254d050931151608a1b6044820152606401610566565b60008060005b8381101561101e57848482818110611f0d57634e487b7160e01b600052603260045260246000fd5b600654604051600162ac0b8d60e01b0319815260209290920293909301356004820181905295506001600160a01b039092169163ff53f473915060240160206040518083038186803b158015611f6257600080fd5b505afa158015611f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a91906149ca565b156121bd576000838152600960209081526040808320815160608082018452915461ffff80821683526001600160501b03620100008084048216858901526001600160a01b03600160601b9485900481168689019081528d8b52600a8a529988902088519788018952549384168752908304909116968501969096520484169282019290925292519092911632148061203f575060408101516001600160a01b031632145b6120805760405162461bcd60e51b81526020600482015260126024820152715357495045522c204e4f2053574950494e4760701b6044820152606401610566565b60408201516001600160a01b03163214156120cf576000858152600960209081526040808320839055848101516001600160a01b03168352600d90915290206120c9908661430d565b50612108565b6000858152600a60209081526040808320839055848101516001600160a01b03168352600d9091529020612106906002018661430d565b505b60016005600082825461211b9190614ecf565b9091555050600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde9061215490309032908a90600401614c46565b600060405180830381600087803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50506040516001925087915032907f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e490600090a45050612543565b6121c683613cfc565b91506000600b60008460ff168152602001908152602001600020600c6000868152602001908152602001600020548154811061221257634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b03169082018190526001909201546060820152915032146122b65760405162461bcd60e51b81526020600482015260126024820152715357495045522c204e4f2053574950494e4760701b6044820152606401610566565b8260ff16600460008282546122cb9190614ecf565b909155505060ff83166000908152600b6020526040812080546122f090600190614ecf565b8154811061230e57634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526002909402909101805461ffff811685526001600160501b0362010000820416858501526001600160a01b03600160601b909104168483015260010154606084015260ff88168452600b8252808420898552600c90925290922054825491935083929181106123a157634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516002909302018054858301516040808801516001600160a01b0316600160601b026001600160601b036001600160501b0390931662010000026001600160601b031990941661ffff978816179390931791909116919091178255606090950151600190910155888352600c815283832054855190921683528383209190915560ff87168252600b90522080548061245457634e487b7160e01b600052603160045260246000fd5b6000828152602080822060026000199094019384020182815560010182905591909255868252600c81526040808320839055848101516001600160a01b03168352600d90915290206124a9906004018661430d565b50600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde906124de90309032908a90600401614c46565b600060405180830381600087803b1580156124f857600080fd5b505af115801561250c573d6000803e3d6000fd5b50506040516001925087915032907f05c665cd73b2f7e81169662803bd83af7b10deb95e709060f3f6057239fc45cb90600090a450505b8061254d81614f09565b915050611ee5565b6000546001600160a01b0316331461257f5760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146125cd5760405162461bcd60e51b815260040161056690614d6c565b6125d76000614319565b565b6000546001600160a01b031633146126035760405162461bcd60e51b815260040161056690614d6c565b6012805460ff1916911515919091179055565b60006004546000141561262b57506000919050565b60006004548363ffffffff166126419190614f24565b60209390931c92905060008061265960036008614ee6565b60ff1690505b6008811161270d576000818152600b6020526040902054612681908290614eb0565b61268b9083614e62565b9150818310612699576126fb565b6000818152600b6020526040902080546126b39087614f24565b815481106126d157634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b031695945050505050565b8061270581614f09565b91505061265f565b506000949350505050565b6000546001600160a01b031633146127425760405162461bcd60e51b815260040161056690614d6c565b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b6001600160a01b0381166000908152600d602052604081206060916127a860048301614369565b6127b483600201614369565b6127bd84614369565b6127c79190614e62565b6127d19190614e62565b6001600160401b038111156127f657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561281f578160200160208202803683370190505b50905060005b61282e83614369565b81101561287c5761283f8382614373565b82828151811061285f57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061287481614f09565b915050612825565b5060005b61288c83600201614369565b8110156128ef576128a06002840182614373565b826128aa85614369565b6128b49084614e62565b815181106128d257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806128e781614f09565b915050612880565b5060005b6128ff83600401614369565b811015612978576129136004840182614373565b8261292085600201614369565b61292986614369565b6129339085614e62565b61293d9190614e62565b8151811061295b57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061297081614f09565b9150506128f3565b509392505050565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b1580156129c957600080fd5b505afa1580156129dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a019190614bf8565b905043816001600160401b031610612a2b5760405162461bcd60e51b815260040161056690614ce8565b6006546040516394e5684760e01b8152600481018590526000916001600160a01b0316906394e56847906024016101406040518083038186803b158015612a7157600080fd5b505afa158015612a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa991906149e6565b805190915015612b0457600084815260096020526040902054600160601b90046001600160a01b0316321480612afc57506000848152600a6020526040902054600160601b90046001600160a01b031632145b949350505050565b6000612b0f85613cfc565b60ff81166000908152600b60209081526040808320898452600c90925290912054815492935032928110612b5357634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154600160601b90046001600160a01b03161495945050505050565b6000546001600160a01b03163314612ba85760405162461bcd60e51b815260040161056690614d6c565b6001600160a01b038116612c0d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610566565b610b2181614319565b600654604051631d7a2e6d60e31b81526004810183905260009182916001600160a01b039091169063ebd173689060240160206040518083038186803b158015612c5f57600080fd5b505afa158015612c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c979190614bf8565b905043816001600160401b031610612cc15760405162461bcd60e51b815260040161056690614ce8565b600654604051600162ac0b8d60e01b03198152600481018590526001600160a01b039091169063ff53f4739060240160206040518083038186803b158015612d0857600080fd5b505afa158015612d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4091906149ca565b15612e6557600254613e8061010090910461ffff1610612d635750600092915050565b6000838152600a60209081526040918290208251606081018452905461ffff811682526201000081046001600160501b031692820192909252600160601b9091046001600160a01b031691810182905290612df55760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420747261696e696e6760701b6044820152606401610566565b600081602001516001600160501b0316118015612e2d57506202a3008160200151612e209190614e7a565b6001600160501b03164210155b156112a257612e3d600184614e62565b92506202a30081602001818151612e549190614e7a565b6001600160501b0316905250612df5565b600254610640630100000090910461ffff1610612e855750600092915050565b6000612e9084613cfc565b90506000600b60008360ff168152602001908152602001600020600c60008781526020019081526020016000205481548110612edc57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051608081018252600293909302909101805461ffff811684526201000081046001600160501b031694840194909452600160601b9093046001600160a01b031690820181905260019092015460608201529150612f7f5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd081a5b88199b1a59da1d606a1b6044820152606401610566565b600081602001516001600160501b0316118015612fb757506202a3008160200151612faa9190614e7a565b6001600160501b03164210155b15612fef57612fc7600185614e62565b93506202a30081602001818151612fde9190614e7a565b6001600160501b0316905250612f7f565b505050919050565b6006546040516331a9108f60e11b81526004810185905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b15801561304057600080fd5b505afa158015613054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307891906147b9565b6001600160a01b03161461309e5760405162461bcd60e51b815260040161056690614cbd565b6000848152600a60209081526040918290208251606081018452905461ffff811682526001600160501b0362010000820416928201929092526001600160a01b03600160601b909204821692810183905291908416146131105760405162461bcd60e51b815260040161056690614da1565b83801561313757506202a30081602001516001600160501b0316426131359190614ecf565b105b156131755760405162461bcd60e51b815260206004820152600e60248201526d5374696c6c20747261696e696e6760901b6044820152606401610566565b600081602001516001600160501b03161180156131ad57506202a30081602001516131a09190614e7a565b6001600160501b03164210155b156131e5576131bd600183614e3c565b91506202a300816020018181516131d49190614e7a565b6001600160501b0316905250613175565b83156132ca5760006131fb878360400151613a40565b9050613a98861161320d575060408101515b6000868152600a602052604081208190556005805460019290613231908490614ecf565b90915550506040808301516001600160a01b03166000908152600d6020522061325d906002018761430d565b50600654604051635c46a7ef60e11b81526001600160a01b039091169063b88d4fde9061329290309085908b90600401614c46565b600060405180830381600087803b1580156132ac57600080fd5b505af11580156132c0573d6000803e3d6000fd5b5050505050613354565b6040805160608101825261ffff8781168252426001600160501b039081166020808501918252868601516001600160a01b0390811686880190815260008d8152600a90935296909120945185549251965194166001600160601b031990921691909117620100009590921694909402176001600160601b0316600160601b91909316029190911790555b83151585846001600160a01b03167f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e460405160405180910390a450949350505050565b6006546040516331a9108f60e11b815260048101859052600091829130916001600160a01b031690636352211e9060240160206040518083038186803b1580156133e057600080fd5b505afa1580156133f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341891906147b9565b6001600160a01b03161461343e5760405162461bcd60e51b815260040161056690614cbd565b600061344986613cfc565b90506000600b60008360ff168152602001908152602001600020600c6000898152602001908152602001600020548154811061349557634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516080810182526002909302909101805461ffff811684526001600160501b0362010000820416948401949094526001600160a01b03600160601b9094048416918301829052600101546060830152909250908616146135155760405162461bcd60e51b815260040161056690614da1565b8060600151600f546135279190614ecf565b6135349060ff8416614eb0565b93505b600081602001516001600160501b031611801561356f57506202a30081602001516135629190614e7a565b6001600160501b03164210155b156135a75761357f600184614e3c565b92506202a300816020018181516135969190614e7a565b6001600160501b0316905250613537565b8515613811578160ff16600460008282546135c29190614ecf565b909155505060ff82166000908152600b6020526040812080546135e790600190614ecf565b8154811061360557634e487b7160e01b600052603260045260246000fd5b60009182526020808320604080516080810182526002909402909101805461ffff811685526001600160501b0362010000820416858501526001600160a01b03600160601b909104168483015260010154606084015260ff87168452600b82528084208c8552600c909252909220548254919350839291811061369857634e487b7160e01b600052603260045260246000fd5b6000918252602080832084516002909302018054858301516040808801516001600160a01b0316600160601b026001600160601b036001600160501b0390931662010000026001600160601b031990941661ffff9788161793909317919091169190911782556060909501516001909101558b8352600c815283832054855190921683528383209190915560ff86168252600b90522080548061374b57634e487b7160e01b600052603160045260246000fd5b6000828152602080822060026000199094019384020182815560010182905591909255898252600c81526040808320839055848101516001600160a01b03168352600d90915290206137a0906004018961430d565b506006546040808401519051635c46a7ef60e11b81526001600160a01b039092169163b88d4fde916137d9913091908d90600401614c46565b600060405180830381600087803b1580156137f357600080fd5b505af1158015613807573d6000803e3d6000fd5b5050505050613909565b60405180608001604052808861ffff168152602001426001600160501b0316815260200182604001516001600160a01b03168152602001600f54815250600b60008460ff168152602001908152602001600020600c60008a8152602001908152602001600020548154811061389657634e487b7160e01b600052603260045260246000fd5b6000918252602091829020835160029092020180549284015160408501516001600160a01b0316600160601b026001600160601b036001600160501b0390921662010000026001600160601b031990951661ffff9094169390931793909317929092161781556060909101516001909101555b8515158782604001516001600160a01b03167f05c665cd73b2f7e81169662803bd83af7b10deb95e709060f3f6057239fc45cb60405160405180910390a45050935093915050565b60025460ff16156139745760405162461bcd60e51b815260040161056690614d42565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586139a93390565b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff16613a0f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610566565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336139a9565b6000613a51600a60f585901c614f24565b15613a5d575080611a13565b6000613a6c609085901c612616565b90506001600160a01b038116613a855782915050611a13565b9392505050565b60025460ff1615613aaf5760405162461bcd60e51b815260040161056690614d42565b6040805160608101825261ffff80841682526001600160501b0342811660208085019182526001600160a01b038089168688019081526000898152600a9093529682209551865493519751909116600160601b026001600160601b039790941662010000026001600160601b031990931694169390931717939093169290921790556005805460019290613b44908490614e62565b90915550506001600160a01b0382166000908152600d60205260409020613b6e906002018261437f565b5060405160018082529082906001600160a01b038516907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb50906020015b60405180910390a45050565b6000613bc282613cfc565b90508060ff1660046000828254613bd99190614e62565b909155505060ff81166000908152600b602081815260408084208054878652600c8452828620819055938352815160808101835261ffff80891682526001600160501b034281168387019081526001600160a01b03808d16858801818152600f54606088019081526001808d018a55988d528a8d2097516002909c02909701805494519151909316600160601b026001600160601b039190951662010000026001600160601b03199094169a9095169990991791909117929092161781559051910155918352600d90529020613cb2906004018361437f565b506040516001815260009083906001600160a01b038616907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb509060200160405180910390a4505050565b6006546040516394e5684760e01b81526004810183905260009182916001600160a01b03909116906394e56847906024016101406040518083038186803b158015613d4657600080fd5b505afa158015613d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d7e91906149e6565b90508061012001516008613a859190614ee6565b6006546040516331a9108f60e11b81526004810185905260009130916001600160a01b0390911690636352211e9060240160206040518083038186803b158015613ddb57600080fd5b505afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e1391906147b9565b6001600160a01b031614613e395760405162461bcd60e51b815260040161056690614cbd565b6000848152600960209081526040918290208251606081018452905461ffff811682526001600160501b0362010000820416928201929092526001600160a01b03600160601b90920482169281018390529190841614613eab5760405162461bcd60e51b815260040161056690614da1565b838015613ed257506202a30081602001516001600160501b031642613ed09190614ecf565b105b15613f1f5760405162461bcd60e51b815260206004820152601860248201527f5374696c6c206775617264696e672074686520746f77657200000000000000006044820152606401610566565b6b019d971e4fe8401e740000006010541015613f775762015180686c6b935b8bbd40000082602001516001600160501b031642613f5c9190614ecf565b613f669190614eb0565b613f709190614e9c565b9150613fd7565b60115481602001516001600160501b03161115613f975760009150613fd7565b62015180686c6b935b8bbd40000082602001516001600160501b0316601154613fc09190614ecf565b613fca9190614eb0565b613fd49190614e9c565b91505b83156140ca57613ff481600001518260200151836040015161438b565b6001166001141561400d576140088261440d565b600091505b60008581526009602052604081208190556005805460019290614031908490614ecf565b90915550506040808201516001600160a01b03166000908152600d6020522061405a908661430d565b506006546040808301519051635c46a7ef60e11b81526001600160a01b039092169163b88d4fde91614093913091908a90600401614c46565b600060405180830381600087803b1580156140ad57600080fd5b505af11580156140c1573d6000803e3d6000fd5b505050506141a6565b60006140d98260400151614466565b90506140f960646140ea8386614eb0565b6140f49190614e9c565b61440d565b60646141058282614ecf565b61410f9085614eb0565b6141199190614e9c565b6040805160608101825261ffff8981168252426001600160501b039081166020808501918252888601516001600160a01b0390811686880190815260008f8152600990935296909120945185549251965194166001600160601b031990921691909117620100009590921694909402176001600160601b0316600160601b91909316029190911790559250505b8315158582604001516001600160a01b03167f8a1a534e66bcba04a3f3c744e07cb63577cf1f92aa381212b23dca6a7da893e460405160405180910390a4509392505050565b60025460ff161561420f5760405162461bcd60e51b815260040161056690614d42565b6040805160608101825261ffff80841682526001600160501b0342811660208085019182526001600160a01b03808916868801908152600089815260099093529682209551865493519751909116600160601b026001600160601b039790941662010000026001600160601b0319909316941693909317179390931692909217905560058054600192906142a4908490614e62565b90915550506001600160a01b0382166000908152600d602052604090206142cb908261437f565b506040516000815260019082906001600160a01b038516907f5d714be08fbd982454a152e9d847e6f4c0f86092098693e04492cb5d7165eb5090602001613bab565b6000613a85838361458f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611a13825490565b6000613a8583836146ac565b6000613a8583836146e4565b600032614399600143614ecf565b6040516001600160601b0319606093841b81166020830152914060348201529184901b1660548201526001600160f01b031960f086901b1660688201526001600160b01b031960b085901b16606a82015260740160408051601f198184030181529190528051602090910120949350505050565b60045461442e5780600e60008282546144269190614e62565b909155505050565b600454600e5461443e9083614e62565b6144489190614e9c565b600f60008282546144599190614e62565b90915550506000600e5550565b6001600160a01b0381166000908152600d60205260408120600a9061448a90614369565b1161452a57600854604051627eeac760e11b81526001600160a01b03848116600483015260066024830152600192169062fdd58e906044015b602060405180830381600087803b1580156144dd57600080fd5b505af11580156144f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145159190614ae7565b1015614522576032611a13565b601492915050565b6001600160a01b0382166000908152600d60205260409020600a9061454e90614369565b6145589190614e9c565b600854604051627eeac760e11b81526001600160a01b038581166004830152600660248301529091169062fdd58e906044016144c3565b600081815260018301602052604081205480156146a25760006145b3600183614ecf565b85549091506000906145c790600190614ecf565b90508181146146485760008660000182815481106145f557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061462657634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061466757634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611a13565b6000915050611a13565b60008260000182815481106146d157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205461472b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611a13565b506000611a13565b60008083601f840112614744578182fd5b5081356001600160401b0381111561475a578182fd5b6020830191508360208260051b850101111561477557600080fd5b9250929050565b805161478781614f79565b919050565b805160ff8116811461478757600080fd5b6000602082840312156147ae578081fd5b8135613a8581614f64565b6000602082840312156147ca578081fd5b8151613a8581614f64565b6000806000606084860312156147e9578182fd5b83356147f481614f64565b9250602084013561480481614f64565b9150604084013561481481614f64565b809150509250925092565b600080600080600060808688031215614836578081fd5b853561484181614f64565b9450602086013561485181614f64565b93506040860135925060608601356001600160401b0380821115614873578283fd5b818801915088601f830112614886578283fd5b813581811115614894578384fd5b8960208285010111156148a5578384fd5b9699959850939650602001949392505050565b6000806000604084860312156148cc578283fd5b83356148d781614f64565b925060208401356001600160401b038111156148f1578283fd5b6148fd86828701614733565b9497909650939450505050565b6000806000806060858703121561491f578384fd5b843561492a81614f64565b935060208501356001600160401b03811115614944578384fd5b61495087828801614733565b909450925050604085013561496481614f79565b939692955090935050565b60008060208385031215614981578182fd5b82356001600160401b03811115614996578283fd5b6149a285828601614733565b90969095509350505050565b6000602082840312156149bf578081fd5b8135613a8581614f79565b6000602082840312156149db578081fd5b8151613a8581614f79565b600061014082840312156149f8578081fd5b614a00614e05565b614a098361477c565b8152614a176020840161478c565b6020820152614a286040840161478c565b6040820152614a396060840161478c565b6060820152614a4a6080840161478c565b6080820152614a5b60a0840161478c565b60a0820152614a6c60c0840161478c565b60c0820152614a7d60e0840161478c565b60e0820152610100614a9081850161478c565b90820152610120614aa284820161478c565b908201529392505050565b600060208284031215614abe578081fd5b813561ffff81168114613a85578182fd5b600060208284031215614ae0578081fd5b5035919050565b600060208284031215614af8578081fd5b5051919050565b60008060008060608587031215614b14578182fd5b843593506020850135614b2681614f64565b925060408501356001600160401b03811115614b40578283fd5b614b4c87828801614733565b95989497509550505050565b600080600080600060808688031215614b6f578283fd5b853594506020860135614b8181614f64565b935060408601356001600160401b03811115614b9b578384fd5b614ba788828901614733565b9094509250506060860135614bbb81614f79565b809150509295509295909350565b60008060408385031215614bdb578182fd5b823591506020830135614bed81614f79565b809150509250929050565b600060208284031215614c09578081fd5b81516001600160401b0381168114613a85578182fd5b6001600160a01b03938416815291909216602082015261ffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6020808252825182820181905260009190848201906040850190845b81811015614cb157835183529284019291840191600101614c95565b50909695505050505050565b6020808252601190820152702237b2b9b713ba1037bbb7103a37b5b2b760791b604082015260600190565b602080825260119082015270686d6d6d6d207768617420646f696e673f60781b604082015260600190565b6020808252601590820152744f6e6c792061646d696e732063616e207374616b6560581b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527224b73b30b634b2103a37b5b2b71037bbb732b960691b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60405161014081016001600160401b0381118282101715614e3657634e487b7160e01b600052604160045260246000fd5b60405290565b600061ffff808316818516808303821115614e5957614e59614f38565b01949350505050565b60008219821115614e7557614e75614f38565b500190565b60006001600160501b03808316818516808303821115614e5957614e59614f38565b600082614eab57614eab614f4e565b500490565b6000816000190483118215151615614eca57614eca614f38565b500290565b600082821015614ee157614ee1614f38565b500390565b600060ff821660ff841680821015614f0057614f00614f38565b90039392505050565b6000600019821415614f1d57614f1d614f38565b5060010190565b600082614f3357614f33614f4e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114610b2157600080fd5b8015158114610b2157600080fdfea2646970667358221220968e7e19933218b0fd7ae4c9eb0f1fd6b728433b02efcbe2253170e567ec7beb64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.