Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 650 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x48656c6c | 20508581 | 543 days ago | IN | 0 ETH | 0.00003074 | ||||
| Rescue | 19096322 | 740 days ago | IN | 0 ETH | 0.00730826 | ||||
| Rescue | 18452446 | 830 days ago | IN | 0 ETH | 0.0013976 | ||||
| Rescue | 18452442 | 830 days ago | IN | 0 ETH | 0.00149979 | ||||
| Rescue | 17859635 | 913 days ago | IN | 0 ETH | 0.00154702 | ||||
| Rescue | 17545386 | 958 days ago | IN | 0 ETH | 0.00177531 | ||||
| Rescue | 17470292 | 968 days ago | IN | 0 ETH | 0.00482671 | ||||
| Rescue | 17015452 | 1032 days ago | IN | 0 ETH | 0.01313138 | ||||
| Rescue | 16907066 | 1048 days ago | IN | 0 ETH | 0.00168103 | ||||
| Rescue | 16880795 | 1051 days ago | IN | 0 ETH | 0.00685677 | ||||
| Rescue | 16878200 | 1052 days ago | IN | 0 ETH | 0.05047147 | ||||
| Rescue | 16858658 | 1054 days ago | IN | 0 ETH | 0.00140503 | ||||
| Rescue | 16858652 | 1054 days ago | IN | 0 ETH | 0.00181135 | ||||
| Rescue | 16858648 | 1054 days ago | IN | 0 ETH | 0.00167297 | ||||
| Rescue | 16858641 | 1054 days ago | IN | 0 ETH | 0.00230701 | ||||
| Rescue | 16852926 | 1055 days ago | IN | 0 ETH | 0.04590149 | ||||
| Rescue | 16739128 | 1071 days ago | IN | 0 ETH | 0.00350565 | ||||
| Rescue | 16739123 | 1071 days ago | IN | 0 ETH | 0.00072973 | ||||
| Rescue | 16718433 | 1074 days ago | IN | 0 ETH | 0.01661871 | ||||
| Rescue | 16718399 | 1074 days ago | IN | 0 ETH | 0.00355175 | ||||
| Rescue | 16718342 | 1074 days ago | IN | 0 ETH | 0.00311181 | ||||
| Rescue | 16661781 | 1082 days ago | IN | 0 ETH | 0.02935766 | ||||
| Rescue | 16495676 | 1105 days ago | IN | 0 ETH | 0.00485382 | ||||
| Rescue | 16452504 | 1111 days ago | IN | 0 ETH | 0.00197753 | ||||
| Rescue | 16379945 | 1121 days ago | IN | 0 ETH | 0.00233086 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.