Source Code
Overview
MOVR Balance
MOVR Value
$0.00Latest 25 from a total of 168 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Deploy Pool | 3775249 | 1056 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3775247 | 1056 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3775247 | 1056 days ago | IN | 0 MOVR | 0.00433555 | ||||
| Deploy Pool | 3775247 | 1056 days ago | IN | 0 MOVR | 0.00433555 | ||||
| Deploy Pool | 3762106 | 1058 days ago | IN | 0 MOVR | 0.0042899 | ||||
| Deploy Pool | 3762105 | 1058 days ago | IN | 0 MOVR | 0.0042899 | ||||
| Deploy Pool | 3762105 | 1058 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3762105 | 1058 days ago | IN | 0 MOVR | 0.0042899 | ||||
| Deploy Pool | 3762104 | 1058 days ago | IN | 0 MOVR | 0.00433555 | ||||
| Deploy Pool | 3762104 | 1058 days ago | IN | 0 MOVR | 0.00433555 | ||||
| Deploy Pool | 3762104 | 1058 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3762103 | 1058 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3732857 | 1062 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3732857 | 1062 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3635757 | 1076 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3635757 | 1076 days ago | IN | 0 MOVR | 0.00428991 | ||||
| Deploy Pool | 3635756 | 1076 days ago | IN | 0 MOVR | 0.00542942 | ||||
| Deploy Pool | 3635756 | 1076 days ago | IN | 0 MOVR | 0.00542942 | ||||
| Update Pylon Rou... | 3587305 | 1083 days ago | IN | 0 MOVR | 0.00007227 | ||||
| Update Pylon Rou... | 3580351 | 1084 days ago | IN | 0 MOVR | 0.00006668 | ||||
| Deploy Pool | 3558668 | 1087 days ago | IN | 0 MOVR | 0.01286975 | ||||
| Deploy Pool | 3558668 | 1087 days ago | IN | 0 MOVR | 0.01286975 | ||||
| Deploy Pool | 3558667 | 1087 days ago | IN | 0 MOVR | 0.01132576 | ||||
| Deploy Pool | 3558667 | 1087 days ago | IN | 0 MOVR | 0.01132576 | ||||
| Deploy Pool | 3543980 | 1089 days ago | IN | 0 MOVR | 0.0042899 |
Latest 25 internal transactions (View All)
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PsionicFarmFactory
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "./PsionicFarmInitializable.sol";
import "./PsionicFarmVault.sol";
contract PsionicFarmFactory is Ownable {
event NewPsionicFarmContract(address indexed psionicFarm);
address public PYLON_ROUTER = address(0);
constructor() {}
bool private _paused = false;
// @notice: Updates the Pylon Router address to use for the Psionic Farm contract
// @param _pylonRouter: Pylon Router Address
function updatePylonRouter(address _pylonRouter) external onlyOwner {
PYLON_ROUTER = _pylonRouter;
}
function isPaused() external view returns (bool) {
return _paused;
}
function switchPause() external onlyOwner {
_paused = !_paused;
}
/*
* @notice Deploy the pool
* @param _stakedToken: staked token address
* @param _rewardToken: reward token address
* @param _rewardPerBlock: reward per block (in rewardToken)
* @param _startBlock: start block
* @param _endBlock: end block
* @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0)
* @param _numberBlocksForUserLimit: block numbers available for user limit (after start block)
* @param _admin: admin address with ownership
* @return address of new psionicFarm contract
*/
function deployPool(
IERC20Metadata _stakedToken,
address[] memory rewardTokens,
uint256 _startBlock,
uint256 _bonusEndBlock,
uint256 _poolLimitPerUser,
uint256 _numberBlocksForUserLimit,
address _admin)
external onlyOwner returns (address psionicFarmAddress, address psionicVault) {
require(_stakedToken.totalSupply() >= 0);
require(_bonusEndBlock > _startBlock);
bytes memory bytecodeVault = type(PsionicFarmVault).creationCode;
bytes32 saltVault = keccak256(abi.encodePacked(_stakedToken, _startBlock));
assembly {
psionicVault := create2(0, add(bytecodeVault, 32), mload(bytecodeVault), saltVault)
}
require(psionicVault != address(0), "Vault creation failed");
bytes memory bytecode = type(PsionicFarmInitializable).creationCode;
bytes32 salt = keccak256(abi.encodePacked(_stakedToken, psionicVault, _startBlock));
assembly {
psionicFarmAddress := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
require(psionicFarmAddress != address(0), "Vault creation failed");
PsionicFarmVault(psionicVault).initialize(
rewardTokens,
(_bonusEndBlock-_startBlock)*1e18,
psionicFarmAddress,
_admin
);
PsionicFarmInitializable(psionicFarmAddress).initialize(
_stakedToken,
IERC20Metadata(psionicVault),
_startBlock,
_bonusEndBlock,
_poolLimitPerUser,
_numberBlocksForUserLimit,
_admin
);
emit NewPsionicFarmContract(psionicFarmAddress);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
import "hardhat/console.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IPsionicFarmVault} from "./interfaces/IPsionicFarmVault.sol";
import {IPsionicFarmFactory} from "./interfaces/IPsionicFarmFactory.sol";
contract PsionicFarmInitializable is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20Metadata;
struct UserInfo {
uint256 amount; // How many staked tokens the user has provided
uint256 rewardDebt; // Reward debt
}
// The address of the psionic factory
address public immutable PSIONIC_FACTORY;
// Whether a limit is set for users
bool public userLimit;
// Whether it is initialized
bool public isInitialized;
// Accrued token per share
uint256 public accTokenPerShare;
// The block number when CAKE mining ends.
uint256 public bonusEndBlock;
// The block number when CAKE mining starts.
uint256 public startBlock;
// The block number of the last pool update
uint256 public lastRewardBlock;
// The pool limit (0 if none)
uint256 public poolLimitPerUser;
// Block numbers available for user limit (after start block)
uint256 public numberBlocksForUserLimit;
// The precision factor
uint256 public PRECISION_FACTOR;
// The reward token
IERC20Metadata public psionicVault;
// The staked token
IERC20Metadata public stakedToken;
// Info of each user that stakes tokens (stakedToken)
mapping(address => UserInfo) public userInfo;
event Deposit(address indexed user, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 amount);
event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock);
event NewPoolLimit(uint256 poolLimitPerUser);
event RewardsStop(uint256 blockNumber);
event TokenRecovery(address indexed token, uint256 amount);
event Withdraw(address indexed user, uint256 amount);
modifier notPaused {
require(!IPsionicFarmFactory(address(PSIONIC_FACTORY)).isPaused(), "The factory is paused");
_;
}
/**
* @notice Constructor
*/
constructor() {
PSIONIC_FACTORY = msg.sender;
}
/*
* @notice Initialize the contract
* @param _stakedToken: staked token address
* @param _psionicVault: vault containing reward tokens
* @param _startBlock: start block
* @param _bonusEndBlock: end block
* @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0)
* @param _numberBlocksForUserLimit: block numbers available for user limit (after start block)
* @param _admin: admin address with ownership
*/
function initialize(
IERC20Metadata _stakedToken,
IERC20Metadata _psionicVault,
uint256 _startBlock,
uint256 _bonusEndBlock,
uint256 _poolLimitPerUser,
uint256 _numberBlocksForUserLimit,
address _admin
) external {
require(!isInitialized, "Already initialized");
require(msg.sender == PSIONIC_FACTORY, "Not factory");
// Make this contract initialized
isInitialized = true;
stakedToken = _stakedToken;
psionicVault = _psionicVault;
startBlock = _startBlock;
bonusEndBlock = _bonusEndBlock;
if (_poolLimitPerUser > 0) {
userLimit = true;
poolLimitPerUser = _poolLimitPerUser;
numberBlocksForUserLimit = _numberBlocksForUserLimit;
}
PRECISION_FACTOR = uint256(10**12);
// Set the lastRewardBlock as the startBlock
lastRewardBlock = startBlock;
// Transfer ownership to the admin address who becomes owner of the contract
transferOwnership(_admin);
}
function _sendTokens(uint _amount, address _to) internal {
IPsionicFarmVault(address(psionicVault)).burn(_to, _amount);
}
function deposit(uint256 _amount, address sender) internal {
UserInfo storage user = userInfo[sender];
userLimit = hasUserLimit();
require(!userLimit || ((_amount + user.amount) <= poolLimitPerUser), "Deposit: Amount above limit");
_updatePool();
// require(user.amount > (user.rewardDebt * PRECISION_FACTOR) / accTokenPerShare,"Not enough user balance");
if (user.amount > 0) {
uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt;
if (pending > 0) {
_sendTokens(pending, address(sender));
}
}
if (_amount > 0) {
user.amount = user.amount + _amount;
stakedToken.safeTransferFrom(address(sender), address(this), _amount);
}
user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR;
emit Deposit(msg.sender, _amount);
}
/*
* @notice Deposit staked tokens and collect reward tokens (if any)
* @param _amount: amount to withdraw (in rewardToken)
*/
function deposit(uint256 _amount) external nonReentrant notPaused {
deposit(_amount, msg.sender);
}
/*
* @notice Deposit staked tokens and collect reward tokens (if any)
* @param _amount: amount to withdraw (in rewardToken)
*/
function routerDeposit(uint256 _amount) external nonReentrant notPaused {
require(IPsionicFarmFactory(address(PSIONIC_FACTORY)).PYLON_ROUTER() == msg.sender, "ONLY PYLON ROUTER");
deposit(_amount, tx.origin);
}
/*
* @notice Withdraw staked tokens and collect reward tokens
* @param _amount: amount to withdraw (in rewardToken)
*/
function withdraw(uint256 _amount) external nonReentrant notPaused{
UserInfo storage user = userInfo[msg.sender];
require(user.amount >= _amount, "Amount to withdraw too high");
_updatePool();
uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt;
if (_amount > 0) {
user.amount = user.amount - _amount;
stakedToken.safeTransfer(address(msg.sender), _amount);
}
if (pending > 0) {
_sendTokens(pending, address(msg.sender));
}
user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR;
emit Withdraw(msg.sender, _amount);
}
/*
* @notice Withdraw staked tokens without caring about rewards rewards
* @dev Needs to be for emergency.
*/
function emergencyWithdraw() external nonReentrant notPaused {
UserInfo storage user = userInfo[msg.sender];
uint256 amountToTransfer = user.amount;
user.amount = 0;
user.rewardDebt = 0;
if (amountToTransfer > 0) {
stakedToken.safeTransfer(address(msg.sender), amountToTransfer);
}
emit EmergencyWithdraw(msg.sender, user.amount);
}
/*
* @notice Stop rewards
* @dev Only callable by owner. Needs to be for emergency.
* This breaks everything so is a closing farm!
* if you want to reduce tokens use modify from Vault
*/
function closingFarm() external onlyOwner {
_sendTokens(psionicVault.balanceOf(address(this)), address(msg.sender));
}
/**
* @notice Allows the owner to recover tokens sent to the contract by mistake
* @param _token: token address
* @dev Callable by owner
*/
function recoverToken(address _token) external onlyOwner {
require(_token != address(stakedToken), "Operations: Cannot recover staked token");
require(_token != address(psionicVault), "Operations: Cannot recover Psionic Vault token");
uint256 balance = IERC20Metadata(_token).balanceOf(address(this));
require(balance != 0, "Operations: Cannot recover zero balance");
IERC20Metadata(_token).safeTransfer(address(msg.sender), balance);
emit TokenRecovery(_token, balance);
}
/*
* @notice Stop rewards
* @dev Only callable by owner
*/
function stopReward() external onlyOwner {
bonusEndBlock = block.number;
}
/*
* @notice Update pool limit per user
* @dev Only callable by owner.
* @param _userLimit: whether the limit remains forced
* @param _poolLimitPerUser: new pool limit per user
*/
function updatePoolLimitPerUser(bool _userLimit, uint256 _poolLimitPerUser) external onlyOwner {
require(userLimit, "Must be set");
if (_userLimit) {
require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher");
poolLimitPerUser = _poolLimitPerUser;
} else {
userLimit = _userLimit;
poolLimitPerUser = 0;
}
emit NewPoolLimit(poolLimitPerUser);
}
/**
* @notice It allows the admin to update start and end blocks
* @dev This function is only callable by owner.
* @param _startBlock: the new start block
* @param _bonusEndBlock: the new end block
*/
function updateStartAndEndBlocks(uint256 _startBlock, uint256 _bonusEndBlock) external onlyOwner {
require(block.number < startBlock, "Pool has started");
require(_startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock");
require(block.number < _startBlock, "New startBlock must be higher than current block");
// balance corresponds 1 to 1 -> to blocks
uint currentBalance = psionicVault.balanceOf(address(this));
uint newMultiplier = (_bonusEndBlock - _startBlock) * (1e18);
if (newMultiplier != currentBalance) {
if (newMultiplier > currentBalance) {
IPsionicFarmVault(address(psionicVault)).adjust(newMultiplier-currentBalance, true);
}else{
IPsionicFarmVault(address(psionicVault)).adjust(currentBalance-newMultiplier, false);
}
}
startBlock = _startBlock;
bonusEndBlock = _bonusEndBlock;
// Set the lastRewardBlock as the startBlock
lastRewardBlock = startBlock;
emit NewStartAndEndBlocks(_startBlock, _bonusEndBlock);
}
/*
* @notice View function to see pending reward on frontend.
* @param _user: user address
* @return Pending reward for a given user
*/
function pendingReward(address _user) external view returns (uint256) {
UserInfo storage user = userInfo[_user];
uint256 stakedTokenSupply = stakedToken.balanceOf(address(this));
if (block.number > lastRewardBlock && stakedTokenSupply != 0) {
uint256 multiplier = _getMultiplier(lastRewardBlock, block.number) * 1e18;
uint256 adjustedTokenPerShare = accTokenPerShare + (multiplier * PRECISION_FACTOR) / stakedTokenSupply;
return (user.amount * adjustedTokenPerShare) / PRECISION_FACTOR - user.rewardDebt;
} else {
return (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt;
}
}
/*
* @notice Update reward variables of the given pool to be up-to-date.
*/
function _updatePool() internal {
if (block.number <= lastRewardBlock) {
return;
}
uint256 stakedTokenSupply = stakedToken.balanceOf(address(this));
if (stakedTokenSupply == 0) {
lastRewardBlock = block.number;
return;
}
uint256 multiplier = _getMultiplier(lastRewardBlock, block.number) * 1e18;
accTokenPerShare = accTokenPerShare + (multiplier * PRECISION_FACTOR) / stakedTokenSupply;
lastRewardBlock = block.number;
}
/*
* @notice Return reward multiplier over the given _from to _to block.
* @param _from: block to start
* @param _to: block to finish
*/
function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) {
if (_to <= bonusEndBlock) {
return _to - _from;
} else if (_from >= bonusEndBlock) {
return 0;
} else {
return bonusEndBlock - _from;
}
}
/*
* @notice Return user limit is set or zero.
*/
function hasUserLimit() public view returns (bool) {
if (!userLimit || (block.number >= (startBlock + numberBlocksForUserLimit))) {
return false;
}
return true;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract PsionicFarmVault is ERC20, Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
// Mapping that contains the reward tokens
mapping (address => bool) tokens;
address[] public rewardTokens;
address public farm;
// Whether it is initialized
bool public isInitialized;
// Address of the Psionic Factory
address public PSIONIC_FACTORY;
// transfering tokens
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
// Only farming modifier
modifier onlyFarm() {
require(msg.sender == farm, "Only Farm is allowed");
_;
}
constructor() ERC20("Psionic", "PT") {
PSIONIC_FACTORY = msg.sender;
}
/*
* @notice: Initialize the contract
* @param _tokens: array of tokens
* @param _initialSupply: supply to mint initially
* @param _farm: Farm Address
*/
function initialize(
address[] memory _rewardTokens,
uint _initialSupply,
address _farm,
address _admin
) external {
require(!isInitialized, "Already initialized");
require(msg.sender == PSIONIC_FACTORY, "Not factory");
require(_rewardTokens.length > 0, "Empty reward tokens");
// Make this contract initialized
isInitialized = true;
// Saving tokens
rewardTokens = _rewardTokens;
uint tokenLength = _rewardTokens.length;
for (uint256 i = 0; i < tokenLength; i++) {
address token = _rewardTokens[i];
bool isToken = tokens[token];
if (isToken) {
revert("Tokens must be unique");
}else{
tokens[token] = true;
}
}
// Minting initial Supply to Psionic Farm
_mint(_farm, _initialSupply);
// Transfer ownership to the admin address who becomes owner of the contract
transferOwnership(_admin);
farm = _farm;
}
// @notice Admin method to add reward token
function add(address token) external onlyOwner {
require(!tokens[token], "Vault: Token already added");
tokens[token] = true;
rewardTokens.push(token);
}
// @notice Admin method to remove reward token
function remove(address token) external onlyOwner {
require(tokens[token], "Vault: Token not added");
require(rewardTokens.length > 1, "At least 1 token is required");
address[] memory _tokens = rewardTokens;
uint tokenLength = _tokens.length;
for (uint256 i = 0; i < tokenLength; i++) {
address rewardToken = _tokens[i];
if (token == rewardToken) {
tokens[token] = false;
rewardTokens[i] = rewardTokens[rewardTokens.length-1];
rewardTokens.pop();
break;
}
}
}
function modifyRewards(address token, uint amount) onlyOwner external {
IERC20(token).safeTransfer(owner(), amount);
}
/*
* @notice Mints amount of tokens to the owner
* @param _amount: of tokens to mint
*/
function adjust(uint _amount, bool shouldMint) external onlyFarm nonReentrant {
if (shouldMint) {
_mint(address(owner()), _amount);
} else {
_burn(address(owner()), _amount);
}
}
/*
* @notice Burn Function to withdraw tokens
* @param _to: the address to send the rewards token
*/
function burn(address _to, uint _liquidity) external onlyFarm nonReentrant {
require(_to != address(0), "PFV: Invalid address");
require(_liquidity > 0, "PFV: Not enough");
address[] memory tokensToWithdraw = rewardTokens;
uint tokenLength = tokensToWithdraw.length;
uint ts = totalSupply();
for (uint256 i = 0; i < tokenLength; i++) {
IERC20 token = IERC20(tokensToWithdraw[i]);
uint balance = token.balanceOf(address(this));
uint amount = (balance * (_liquidity))/ts;
token.safeTransfer(_to, amount);
}
_burn(farm, _liquidity);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
}
function log(uint p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
}
function log(uint p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
}
function log(uint p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
}
function log(string memory p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
}
function log(uint p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
}
function log(uint p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
}
function log(uint p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
}
function log(uint p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
}
function log(uint p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
}
function log(uint p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
}
function log(uint p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
}
function log(uint p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
}
function log(uint p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
}
function log(uint p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
}
function log(uint p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
}
function log(uint p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
}
function log(uint p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
}
function log(uint p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
}
function log(uint p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
}
function log(string memory p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
}
function log(string memory p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
}
function log(string memory p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
}
function log(string memory p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
}
function log(bool p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
}
function log(bool p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
}
function log(bool p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
}
function log(address p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
}
function log(address p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
}
function log(address p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
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 making 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
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IPsionicFarmVault {
function rewardTokens(uint) external view returns (address);
function isInitialized() external view returns (bool);
function PSIONIC_FACTORY() external view returns (address);
/*
* @notice: Initialize the contract
* @param _tokens: array of tokens
* @param _initialSupply: supply to mint initially
* @param _farm: Farm Address
*/
function initialize(
address[] memory _tokens,
uint _initialSupply,
address _farm
) external;
/*
* @notice: Mints amount of tokens to the owner
* @param: _amount of tokens to mint
*/
function adjust(uint _amount, bool shouldMint) external;
/*
* @notice: Allows owner to change tokens
* @param: new tokens mapping
*/
// function updateTokens(address[] memory _tokens) external;
/*
* @notice Burn Function to withdraw tokens
* @param _to: the address to send the rewards token
*/
function burn(address _to, uint _liquidity) external;
function add(address token) external;
function remove(address token) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
interface IPsionicFarmFactory {
function PYLON_ROUTER() external view returns (address);
function deployPool(
IERC20Metadata _stakedToken,
address[] memory rewardTokens,
uint256 _startBlock,
uint256 _bonusEndBlock,
uint256 _poolLimitPerUser,
uint256 _numberBlocksForUserLimit,
address _admin)
external returns (address psionicFarmAddress, address psionicVault);
function updatePylonRouter(address _pylonRouter) external;
function isPaused() external view returns (bool);
function switchPause() external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"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":"psionicFarm","type":"address"}],"name":"NewPsionicFarmContract","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"},{"inputs":[],"name":"PYLON_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"_stakedToken","type":"address"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_numberBlocksForUserLimit","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"}],"name":"deployPool","outputs":[{"internalType":"address","name":"psionicFarmAddress","type":"address"},{"internalType":"address","name":"psionicVault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pylonRouter","type":"address"}],"name":"updatePylonRouter","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052600180546001600160a81b031916905534801561002057600080fd5b5061002a3361002f565b61007f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6158ff8061008e6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806377d270581161005b57806377d27058146100f75780638da5cb5b1461013c578063b187bd261461015a578063f2fde38b1461018857600080fd5b80632cd981d41461008d57806365b0d24214610097578063715018a6146100aa578063746baf09146100b2575b600080fd5b61009561019b565b005b6100956100a5366004610a96565b61026e565b610095610336565b6100c56100c0366004610ab9565b6103c3565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152015b60405180910390f35b6001546101179073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ee565b60005473ffffffffffffffffffffffffffffffffffffffff16610117565b60015474010000000000000000000000000000000000000000900460ff1660405190151581526020016100ee565b610095610196366004610a96565b6108c5565b60005473ffffffffffffffffffffffffffffffffffffffff163314610221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b6103c160006109f5565b565b60008054819073ffffffffffffffffffffffffffffffffffffffff163314610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b60008973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048f57600080fd5b505afa1580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c79190610bed565b10156104d257600080fd5b8686116104de57600080fd5b6000604051806020016104f090610a6a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608d901b166020820152603481018a9052909150600090605401604051602081830303815290604052805190602001209050808251602084016000f5925073ffffffffffffffffffffffffffffffffffffffff8316610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5661756c74206372656174696f6e206661696c656400000000000000000000006044820152606401610218565b60006040518060200161061290610a78565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608f811b8216602084015287901b166034820152604881018c9052909150600090606801604051602081830303815290604052805190602001209050808251602084016000f5955073ffffffffffffffffffffffffffffffffffffffff861661072c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5661756c74206372656174696f6e206661696c656400000000000000000000006044820152606401610218565b73ffffffffffffffffffffffffffffffffffffffff851663c1b4a1e38d6107538e8e610cc6565b61076590670de0b6b3a7640000610c89565b898b6040518563ffffffff1660e01b81526004016107869493929190610c05565b600060405180830381600087803b1580156107a057600080fd5b505af11580156107b4573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff166383a5041c8e878e8e8e8e8e6040518863ffffffff1660e01b8152600401610842979695949392919073ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b600060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff891692507f8d36e1fbd68da6ea8f439d93c71f840293ec6442e3ae4c6ee5689bb33ba70e369150600090a25050505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b73ffffffffffffffffffffffffffffffffffffffff81166109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610218565b6109f2816109f5565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6124968062000d5e83390190565b6126d680620031f483390190565b8035610a9181610d3b565b919050565b600060208284031215610aa7578081fd5b8135610ab281610d3b565b9392505050565b600080600080600080600060e0888a031215610ad3578283fd5b8735610ade81610d3b565b965060208881013567ffffffffffffffff80821115610afb578586fd5b818b0191508b601f830112610b0e578586fd5b813581811115610b2057610b20610d0c565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715610b6357610b63610d0c565b806040525080935082815285810193508585018f87848801011115610b8657898afd5b8995505b83861015610baf57610b9b81610a86565b855260019590950194938601938601610b8a565b509a5050505060408a013596505050606088013593506080880135925060a08801359150610bdf60c08901610a86565b905092959891949750929550565b600060208284031215610bfe578081fd5b5051919050565b6080808252855190820181905260009060209060a0840190828901845b82811015610c5457815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610c22565b505050908301959095525073ffffffffffffffffffffffffffffffffffffffff92831660408201529116606090910152919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610cc157610cc1610cdd565b500290565b600082821015610cd857610cd8610cdd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146109f257600080fdfe60806040523480156200001157600080fd5b5060408051808201825260078152665073696f6e696360c81b602080830191825283518085019094526002845261141560f21b9084015281519192916200005b9160039162000101565b5080516200007190600490602084019062000101565b5050506200008e62000088620000ab60201b60201c565b620000af565b6001600655600a80546001600160a01b03191633179055620001e4565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600181811c90821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b6122a280620001f46000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806370a08231116100e3578063a457c2d71161008c578063cfa2727411610066578063cfa272741461036c578063dd62ed3e1461037f578063f2fde38b146103b857600080fd5b8063a457c2d714610333578063a9059cbb14610346578063c1b4a1e31461035957600080fd5b80638da5cb5b116100bd5780638da5cb5b1461030757806395d89b41146103185780639dc29fac1461032057600080fd5b806370a08231146102c3578063715018a6146102ec5780637bb7bed1146102f457600080fd5b8063306a4bf411610145578063392e53cd1161011f578063392e53cd14610278578063395093511461029d5780636d0e002c146102b057600080fd5b8063306a4bf41461022b578063313ce5671461023e57806336e9332d1461024d57600080fd5b806318160ddd1161017657806318160ddd146101f357806323b872dd1461020557806329092d0e1461021857600080fd5b806306fdde031461019d578063095ea7b3146101bb5780630a3b0a4f146101de575b600080fd5b6101a56103cb565b6040516101b29190612051565b60405180910390f35b6101ce6101c9366004611e81565b61045d565b60405190151581526020016101b2565b6101f16101ec366004611dfa565b610475565b005b6002545b6040519081526020016101b2565b6101ce610213366004611e46565b6105d9565b6101f1610226366004611dfa565b6105ff565b6101f1610239366004612006565b610995565b604051601281526020016101b2565b600954610260906001600160a01b031681565b6040516001600160a01b0390911681526020016101b2565b6009546101ce9074010000000000000000000000000000000000000000900460ff1681565b6101ce6102ab366004611e81565b610a91565b600a54610260906001600160a01b031681565b6101f76102d1366004611dfa565b6001600160a01b031660009081526020819052604090205490565b6101f1610ad0565b610260610302366004611fd6565b610b36565b6005546001600160a01b0316610260565b6101a5610b60565b6101f161032e366004611e81565b610b6f565b6101ce610341366004611e81565b610e88565b6101ce610354366004611e81565b610f3d565b6101f1610367366004611eaa565b610f4b565b6101f161037a366004611e81565b61121b565b6101f761038d366004611e14565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101f16103c6366004611dfa565b61129f565b6060600380546103da90612173565b80601f016020809104026020016040519081016040528092919081815260200182805461040690612173565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b5050505050905090565b60003361046b818585611381565b5060019392505050565b6005546001600160a01b031633146104d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff161561053d5760405162461bcd60e51b815260206004820152601a60248201527f5661756c743a20546f6b656e20616c726561647920616464656400000000000060448201526064016104cb565b6001600160a01b0316600081815260076020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6000336105e78582856114da565b6105f2858585611584565b60019150505b9392505050565b6005546001600160a01b031633146106595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b6001600160a01b03811660009081526007602052604090205460ff166106c15760405162461bcd60e51b815260206004820152601660248201527f5661756c743a20546f6b656e206e6f742061646465640000000000000000000060448201526064016104cb565b6008546001106107135760405162461bcd60e51b815260206004820152601c60248201527f4174206c65617374203120746f6b656e2069732072657175697265640000000060448201526064016104cb565b6000600880548060200260200160405190810160405280929190818152602001828054801561076b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161074d575b505083519394506000925050505b8181101561098f5760008382815181106107bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050806001600160a01b0316856001600160a01b0316141561097c576001600160a01b038516600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556008805461082e90600190612130565b81548110610865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200154600880546001600160a01b0390921691849081106108b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061091e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555061098f565b5080610987816121c7565b915050610779565b50505050565b6009546001600160a01b031633146109ef5760405162461bcd60e51b815260206004820152601460248201527f4f6e6c79204661726d20697320616c6c6f77656400000000000000000000000060448201526064016104cb565b60026006541415610a425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cb565b60026006558015610a6d57610a68610a626005546001600160a01b031690565b8361179b565b610a88565b610a88610a826005546001600160a01b031690565b8361187a565b50506001600655565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061046b9082908690610acb9087906120a2565b611381565b6005546001600160a01b03163314610b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b610b3460006119fc565b565b60088181548110610b4657600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600480546103da90612173565b6009546001600160a01b03163314610bc95760405162461bcd60e51b815260206004820152601460248201527f4f6e6c79204661726d20697320616c6c6f77656400000000000000000000000060448201526064016104cb565b60026006541415610c1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cb565b60026006556001600160a01b038216610c775760405162461bcd60e51b815260206004820152601460248201527f5046563a20496e76616c6964206164647265737300000000000000000000000060448201526064016104cb565b60008111610cc75760405162461bcd60e51b815260206004820152600f60248201527f5046563a204e6f7420656e6f756768000000000000000000000000000000000060448201526064016104cb565b60006008805480602002602001604051908101604052809291908181526020018280548015610d1f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d01575b505050505090506000815190506000610d3760025490565b905060005b82811015610e65576000848281518110610d7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610de857600080fd5b505afa158015610dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e209190611fee565b9050600084610e2f89846120f3565b610e3991906120ba565b9050610e4f6001600160a01b0384168a83611a66565b5050508080610e5d906121c7565b915050610d3c565b50600954610e7c906001600160a01b03168561187a565b50506001600655505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610f255760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104cb565b610f328286868403611381565b506001949350505050565b60003361046b818585611584565b60095474010000000000000000000000000000000000000000900460ff1615610fb65760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016104cb565b600a546001600160a01b031633146110105760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f727900000000000000000000000000000000000000000060448201526064016104cb565b60008451116110615760405162461bcd60e51b815260206004820152601360248201527f456d7074792072657761726420746f6b656e730000000000000000000000000060448201526064016104cb565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905583516110b3906008906020870190611d4c565b50835160005b818110156111c95760008682815181106110fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516001600160a01b0381166000908152600790925260409091205490915060ff1680156111765760405162461bcd60e51b815260206004820152601560248201527f546f6b656e73206d75737420626520756e69717565000000000000000000000060448201526064016104cb565b506001600160a01b0316600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055806111c1816121c7565b9150506110b9565b506111d4838561179b565b6111dd8261129f565b5050600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555050565b6005546001600160a01b031633146112755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b61129b61128a6005546001600160a01b031690565b6001600160a01b0384169083611a66565b5050565b6005546001600160a01b031633146112f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b6001600160a01b0381166113755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104cb565b61137e816119fc565b50565b6001600160a01b0383166113fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0382166114785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f57818110156115775760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104cb565b61098f8484848403611381565b6001600160a01b0383166116005760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b03821661167c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0383166000908152602081905260409020548181101561170b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906117429084906120a2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161178e91815260200190565b60405180910390a361098f565b6001600160a01b0382166117f15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104cb565b806002600082825461180391906120a2565b90915550506001600160a01b038216600090815260208190526040812080548392906118309084906120a2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b038216600090815260208190526040902054818110156119855760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119b4908490612130565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114cd565b505050565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526119f792869291600091611b24918516908490611bb4565b8051909150156119f75780806020019051810190611b429190611fba565b6119f75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104cb565b6060611bc38484600085611bcb565b949350505050565b606082471015611c435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0385163b611c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104cb565b600080866001600160a01b03168587604051611cb69190612035565b60006040518083038185875af1925050503d8060008114611cf3576040519150601f19603f3d011682016040523d82523d6000602084013e611cf8565b606091505b5091509150611d08828286611d13565b979650505050505050565b60608315611d225750816105f8565b825115611d325782518084602001fd5b8160405162461bcd60e51b81526004016104cb9190612051565b828054828255906000526020600020908101928215611db9579160200282015b82811115611db957825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190611d6c565b50611dc5929150611dc9565b5090565b5b80821115611dc55760008155600101611dca565b80356001600160a01b0381168114611df557600080fd5b919050565b600060208284031215611e0b578081fd5b6105f882611dde565b60008060408385031215611e26578081fd5b611e2f83611dde565b9150611e3d60208401611dde565b90509250929050565b600080600060608486031215611e5a578081fd5b611e6384611dde565b9250611e7160208501611dde565b9150604084013590509250925092565b60008060408385031215611e93578182fd5b611e9c83611dde565b946020939093013593505050565b60008060008060808587031215611ebf578081fd5b843567ffffffffffffffff80821115611ed6578283fd5b818701915087601f830112611ee9578283fd5b8135602082821115611efd57611efd61222f565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715611f4057611f4061222f565b604052838152828101945085830182870184018d1015611f5e578788fd5b8796505b84871015611f8757611f7381611dde565b865260019690960195948301948301611f62565b509850508801359550611fa1925050604087019050611dde565b9150611faf60608601611dde565b905092959194509250565b600060208284031215611fcb578081fd5b81516105f88161225e565b600060208284031215611fe7578081fd5b5035919050565b600060208284031215611fff578081fd5b5051919050565b60008060408385031215612018578182fd5b82359150602083013561202a8161225e565b809150509250929050565b60008251612047818460208701612147565b9190910192915050565b6020815260008251806020840152612070816040850160208701612147565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156120b5576120b5612200565b500190565b6000826120ee577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561212b5761212b612200565b500290565b60008282101561214257612142612200565b500390565b60005b8381101561216257818101518382015260200161214a565b8381111561098f5750506000910152565b600181811c9082168061218757607f821691505b602082108114156121c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121f9576121f9612200565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461137e57600080fdfea2646970667358221220faea82ec19889de8a73e6a819d5bc2560b8838661cc1dff791566f43520cc61464736f6c6343000804003360a060405234801561001057600080fd5b5061001a3361002a565b600180553360601b60805261007a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805160601c6126146100c2600039600081816102dc01528181610467015281816108010152818161090301528181610b61015281816115df015261172f01526126146000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638ad1071b116100f9578063a9f8d18111610097578063ccd34cd511610071578063ccd34cd5146103ce578063db2e21bc146103d7578063f2fde38b146103df578063f40f0f52146103f257600080fd5b8063a9f8d18114610392578063b6b55f251461039b578063cc7a262e146103ae57600080fd5b806392e8990e116100d357806392e8990e146103515780639513997f146103595780639be65a601461036c578063a0b409051461037f57600080fd5b80638ad1071b146103215780638da5cb5b1461032a5780638f6629151461034857600080fd5b806348cd4cb1116101665780636d0e002c116101405780636d0e002c146102d7578063715018a6146102fe57806380dc06721461030657806383a5041c1461030e57600080fd5b806348cd4cb1146102b85780634a7c01ec146102c157806366fe9f8a146102ce57600080fd5b806331026ce1116101a257806331026ce114610236578063392e53cd1461023e578063448b7a5114610260578063462293a3146102a557600080fd5b80631959a002146101c95780631aed65531461020a5780632e1a7d4d14610221575b600080fd5b6101f06101d7366004612300565b600c602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b61021360045481565b604051908152602001610201565b61023461022f3660046123f0565b610405565b005b610234610692565b60025461025090610100900460ff1681565b6040519015158152602001610201565b600a546102809073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610201565b6102346102b33660046123f0565b6107a4565b61021360055481565b6002546102509060ff1681565b61021360075481565b6102807f000000000000000000000000000000000000000000000000000000000000000081565b610234610a13565b610234610a84565b61023461031c36600461237f565b610af1565b61021360085481565b60005473ffffffffffffffffffffffffffffffffffffffff16610280565b61021360035481565b610250610cb6565b610234610367366004612420565b610ceb565b61023461037a366004612300565b6110e4565b61023461038d366004612354565b6113f7565b61021360065481565b6102346103a93660046123f0565b611582565b600b546102809073ffffffffffffffffffffffffffffffffffffffff1681565b61021360095481565b6102346116d2565b6102346103ed366004612300565b61189e565b610213610400366004612300565b61199a565b6002600154141561045d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105039190612338565b156105505760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b336000908152600c6020526040902080548211156105b05760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610454565b6105b8611b1e565b6000816001015460095460035484600001546105d491906124ff565b6105de91906124c6565b6105e8919061253c565b905082156106235781546105fd90849061253c565b8255600b546106239073ffffffffffffffffffffffffffffffffffffffff163385611c2c565b8015610633576106338133611d05565b600954600354835461064591906124ff565b61064f91906124c6565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600a546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526107a29173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561076457600080fd5b505afa158015610778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079c9190612408565b33611d05565b565b600260015414156107f75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190612338565b156108ea5760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d270586040518163ffffffff1660e01b815260040160206040518083038186803b15801561096757600080fd5b505afa15801561097b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099f919061231c565b73ffffffffffffffffffffffffffffffffffffffff1614610a025760405162461bcd60e51b815260206004820152601160248201527f4f4e4c592050594c4f4e20524f555445520000000000000000000000000000006044820152606401610454565b610a0c8132611d95565b5060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6107a26000611f40565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b43600455565b600254610100900460ff1615610b495760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610454565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bce5760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f72790000000000000000000000000000000000000000006044820152606401610454565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600b805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a805492891692909116919091179055600585905560048490558215610c9557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b64e8d4a51000600955600554600655610cad8161189e565b50505050505050565b60025460009060ff161580610cda5750600854600554610cd691906124ae565b4310155b15610ce55750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6005544310610da35760405162461bcd60e51b815260206004820152601060248201527f506f6f6c206861732073746172746564000000000000000000000000000000006044820152606401610454565b808210610e185760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610454565b814310610e8d5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610454565b600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f9190612408565b90506000610f3d848461253c565b610f4f90670de0b6b3a76400006124ff565b90508181146110965781811115610ffd57600a5473ffffffffffffffffffffffffffffffffffffffff1663306a4bf4610f88848461253c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915260016024820152604401600060405180830381600087803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b50505050611096565b600a5473ffffffffffffffffffffffffffffffffffffffff1663306a4bf4611025838561253c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915260006024820152604401600060405180830381600087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050505b60058490556004839055600684905560408051858152602081018590527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461114b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600b5473ffffffffffffffffffffffffffffffffffffffff828116911614156111dc5760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610454565b600a5473ffffffffffffffffffffffffffffffffffffffff8281169116141561126d5760405162461bcd60e51b815260206004820152602e60248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572205073696f6e60448201527f6963205661756c7420746f6b656e0000000000000000000000000000000000006064820152608401610454565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156112d557600080fd5b505afa1580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130d9190612408565b9050806113825760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e6365000000000000000000000000000000000000000000000000006064820152608401610454565b6113a373ffffffffffffffffffffffffffffffffffffffff83163383611c2c565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516113eb91815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461145e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60025460ff166114b05760405162461bcd60e51b815260206004820152600b60248201527f4d757374206265207365740000000000000000000000000000000000000000006044820152606401610454565b81156115115760075481116115075760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610454565b6007819055611543565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c60075460405161157691815260200190565b60405180910390a15050565b600260015414156115d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561164357600080fd5b505afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b9190612338565b156116c85760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b610a0c8133611d95565b600260015414156117255760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb9190612338565b156118185760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b336000908152600c602052604081208054828255600182019290925590801561185f57600b5461185f9073ffffffffffffffffffffffffffffffffffffffff163383611c2c565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b73ffffffffffffffffffffffffffffffffffffffff811661198e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b61199781611f40565b50565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600c6020526040808220600b5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b158015611a1a57600080fd5b505afa158015611a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a529190612408565b905060065443118015611a6457508015155b15611aeb576000611a7760065443611fb5565b611a8990670de0b6b3a76400006124ff565b905060008260095483611a9c91906124ff565b611aa691906124c6565b600354611ab391906124ae565b90508360010154600954828660000154611acd91906124ff565b611ad791906124c6565b611ae1919061253c565b9695505050505050565b60018201546009546003548454611b0291906124ff565b611b0c91906124c6565b611b16919061253c565b949350505050565b6006544311611b2957565b600b546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611b9357600080fd5b505afa158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb9190612408565b905080611bd9575043600655565b6000611be760065443611fb5565b611bf990670de0b6b3a76400006124ff565b90508160095482611c0a91906124ff565b611c1491906124c6565b600354611c2191906124ae565b600355505043600655565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d009084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611ff6565b505050565b600a546040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820185905290911690639dc29fac90604401600060405180830381600087803b158015611d7957600080fd5b505af1158015611d8d573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c60205260409020611dc2610cb6565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611e0c57506007548154611e0990856124ae565b11155b611e585760405162461bcd60e51b815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d697400000000006044820152606401610454565b611e60611b1e565b805415611eab57600081600101546009546003548460000154611e8391906124ff565b611e8d91906124c6565b611e97919061253c565b90508015611ea957611ea98184611d05565b505b8215611ee5578054611ebe9084906124ae565b8155600b54611ee59073ffffffffffffffffffffffffffffffffffffffff168330866120e8565b6009546003548254611ef791906124ff565b611f0191906124c6565b600182015560405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006004548211611fd157611fca838361253c565b9050611ff0565b6004548310611fe257506000611ff0565b82600454611fca919061253c565b92915050565b6000612058826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661214c9092919063ffffffff16565b805190915015611d0057808060200190518101906120769190612338565b611d005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610454565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526121469085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611c7e565b50505050565b606061215b8484600085612165565b90505b9392505050565b6060824710156121dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610454565b73ffffffffffffffffffffffffffffffffffffffff85163b6122415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610454565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161226a9190612441565b60006040518083038185875af1925050503d80600081146122a7576040519150601f19603f3d011682016040523d82523d6000602084013e6122ac565b606091505b50915091506122bc8282866122c7565b979650505050505050565b606083156122d657508161215e565b8251156122e65782518084602001fd5b8160405162461bcd60e51b8152600401610454919061245d565b600060208284031215612311578081fd5b813561215e816125ae565b60006020828403121561232d578081fd5b815161215e816125ae565b600060208284031215612349578081fd5b815161215e816125d0565b60008060408385031215612366578081fd5b8235612371816125d0565b946020939093013593505050565b600080600080600080600060e0888a031215612399578283fd5b87356123a4816125ae565b965060208801356123b4816125ae565b955060408801359450606088013593506080880135925060a0880135915060c08801356123e0816125ae565b8091505092959891949750929550565b600060208284031215612401578081fd5b5035919050565b600060208284031215612419578081fd5b5051919050565b60008060408385031215612432578182fd5b50508035926020909101359150565b60008251612453818460208701612553565b9190910192915050565b602081526000825180602084015261247c816040850160208701612553565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156124c1576124c161257f565b500190565b6000826124fa577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125375761253761257f565b500290565b60008282101561254e5761254e61257f565b500390565b60005b8381101561256e578181015183820152602001612556565b838111156121465750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461199757600080fd5b801515811461199757600080fdfea2646970667358221220985ffbe62dc6415af0963bc7a6de9ae18900298da89ecd2571783fe31cf3215e64736f6c63430008040033a26469706673582212206b97d7234046f13221dc4415337b2994de8794e1bd34e4958f6c88f7b2d9883e64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c806377d270581161005b57806377d27058146100f75780638da5cb5b1461013c578063b187bd261461015a578063f2fde38b1461018857600080fd5b80632cd981d41461008d57806365b0d24214610097578063715018a6146100aa578063746baf09146100b2575b600080fd5b61009561019b565b005b6100956100a5366004610a96565b61026e565b610095610336565b6100c56100c0366004610ab9565b6103c3565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152015b60405180910390f35b6001546101179073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ee565b60005473ffffffffffffffffffffffffffffffffffffffff16610117565b60015474010000000000000000000000000000000000000000900460ff1660405190151581526020016100ee565b610095610196366004610a96565b6108c5565b60005473ffffffffffffffffffffffffffffffffffffffff163314610221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff1615909102179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b6103c160006109f5565b565b60008054819073ffffffffffffffffffffffffffffffffffffffff163314610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b60008973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048f57600080fd5b505afa1580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c79190610bed565b10156104d257600080fd5b8686116104de57600080fd5b6000604051806020016104f090610a6a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608d901b166020820152603481018a9052909150600090605401604051602081830303815290604052805190602001209050808251602084016000f5925073ffffffffffffffffffffffffffffffffffffffff8316610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5661756c74206372656174696f6e206661696c656400000000000000000000006044820152606401610218565b60006040518060200161061290610a78565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608f811b8216602084015287901b166034820152604881018c9052909150600090606801604051602081830303815290604052805190602001209050808251602084016000f5955073ffffffffffffffffffffffffffffffffffffffff861661072c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5661756c74206372656174696f6e206661696c656400000000000000000000006044820152606401610218565b73ffffffffffffffffffffffffffffffffffffffff851663c1b4a1e38d6107538e8e610cc6565b61076590670de0b6b3a7640000610c89565b898b6040518563ffffffff1660e01b81526004016107869493929190610c05565b600060405180830381600087803b1580156107a057600080fd5b505af11580156107b4573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff166383a5041c8e878e8e8e8e8e6040518863ffffffff1660e01b8152600401610842979695949392919073ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b600060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff891692507f8d36e1fbd68da6ea8f439d93c71f840293ec6442e3ae4c6ee5689bb33ba70e369150600090a25050505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610218565b73ffffffffffffffffffffffffffffffffffffffff81166109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610218565b6109f2816109f5565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6124968062000d5e83390190565b6126d680620031f483390190565b8035610a9181610d3b565b919050565b600060208284031215610aa7578081fd5b8135610ab281610d3b565b9392505050565b600080600080600080600060e0888a031215610ad3578283fd5b8735610ade81610d3b565b965060208881013567ffffffffffffffff80821115610afb578586fd5b818b0191508b601f830112610b0e578586fd5b813581811115610b2057610b20610d0c565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715610b6357610b63610d0c565b806040525080935082815285810193508585018f87848801011115610b8657898afd5b8995505b83861015610baf57610b9b81610a86565b855260019590950194938601938601610b8a565b509a5050505060408a013596505050606088013593506080880135925060a08801359150610bdf60c08901610a86565b905092959891949750929550565b600060208284031215610bfe578081fd5b5051919050565b6080808252855190820181905260009060209060a0840190828901845b82811015610c5457815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101610c22565b505050908301959095525073ffffffffffffffffffffffffffffffffffffffff92831660408201529116606090910152919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610cc157610cc1610cdd565b500290565b600082821015610cd857610cd8610cdd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146109f257600080fdfe60806040523480156200001157600080fd5b5060408051808201825260078152665073696f6e696360c81b602080830191825283518085019094526002845261141560f21b9084015281519192916200005b9160039162000101565b5080516200007190600490602084019062000101565b5050506200008e62000088620000ab60201b60201c565b620000af565b6001600655600a80546001600160a01b03191633179055620001e4565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600181811c90821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b6122a280620001f46000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806370a08231116100e3578063a457c2d71161008c578063cfa2727411610066578063cfa272741461036c578063dd62ed3e1461037f578063f2fde38b146103b857600080fd5b8063a457c2d714610333578063a9059cbb14610346578063c1b4a1e31461035957600080fd5b80638da5cb5b116100bd5780638da5cb5b1461030757806395d89b41146103185780639dc29fac1461032057600080fd5b806370a08231146102c3578063715018a6146102ec5780637bb7bed1146102f457600080fd5b8063306a4bf411610145578063392e53cd1161011f578063392e53cd14610278578063395093511461029d5780636d0e002c146102b057600080fd5b8063306a4bf41461022b578063313ce5671461023e57806336e9332d1461024d57600080fd5b806318160ddd1161017657806318160ddd146101f357806323b872dd1461020557806329092d0e1461021857600080fd5b806306fdde031461019d578063095ea7b3146101bb5780630a3b0a4f146101de575b600080fd5b6101a56103cb565b6040516101b29190612051565b60405180910390f35b6101ce6101c9366004611e81565b61045d565b60405190151581526020016101b2565b6101f16101ec366004611dfa565b610475565b005b6002545b6040519081526020016101b2565b6101ce610213366004611e46565b6105d9565b6101f1610226366004611dfa565b6105ff565b6101f1610239366004612006565b610995565b604051601281526020016101b2565b600954610260906001600160a01b031681565b6040516001600160a01b0390911681526020016101b2565b6009546101ce9074010000000000000000000000000000000000000000900460ff1681565b6101ce6102ab366004611e81565b610a91565b600a54610260906001600160a01b031681565b6101f76102d1366004611dfa565b6001600160a01b031660009081526020819052604090205490565b6101f1610ad0565b610260610302366004611fd6565b610b36565b6005546001600160a01b0316610260565b6101a5610b60565b6101f161032e366004611e81565b610b6f565b6101ce610341366004611e81565b610e88565b6101ce610354366004611e81565b610f3d565b6101f1610367366004611eaa565b610f4b565b6101f161037a366004611e81565b61121b565b6101f761038d366004611e14565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101f16103c6366004611dfa565b61129f565b6060600380546103da90612173565b80601f016020809104026020016040519081016040528092919081815260200182805461040690612173565b80156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b5050505050905090565b60003361046b818585611381565b5060019392505050565b6005546001600160a01b031633146104d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff161561053d5760405162461bcd60e51b815260206004820152601a60248201527f5661756c743a20546f6b656e20616c726561647920616464656400000000000060448201526064016104cb565b6001600160a01b0316600081815260076020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6000336105e78582856114da565b6105f2858585611584565b60019150505b9392505050565b6005546001600160a01b031633146106595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b6001600160a01b03811660009081526007602052604090205460ff166106c15760405162461bcd60e51b815260206004820152601660248201527f5661756c743a20546f6b656e206e6f742061646465640000000000000000000060448201526064016104cb565b6008546001106107135760405162461bcd60e51b815260206004820152601c60248201527f4174206c65617374203120746f6b656e2069732072657175697265640000000060448201526064016104cb565b6000600880548060200260200160405190810160405280929190818152602001828054801561076b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161074d575b505083519394506000925050505b8181101561098f5760008382815181106107bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050806001600160a01b0316856001600160a01b0316141561097c576001600160a01b038516600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556008805461082e90600190612130565b81548110610865577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200154600880546001600160a01b0390921691849081106108b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061091e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555061098f565b5080610987816121c7565b915050610779565b50505050565b6009546001600160a01b031633146109ef5760405162461bcd60e51b815260206004820152601460248201527f4f6e6c79204661726d20697320616c6c6f77656400000000000000000000000060448201526064016104cb565b60026006541415610a425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cb565b60026006558015610a6d57610a68610a626005546001600160a01b031690565b8361179b565b610a88565b610a88610a826005546001600160a01b031690565b8361187a565b50506001600655565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061046b9082908690610acb9087906120a2565b611381565b6005546001600160a01b03163314610b2a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b610b3460006119fc565b565b60088181548110610b4657600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600480546103da90612173565b6009546001600160a01b03163314610bc95760405162461bcd60e51b815260206004820152601460248201527f4f6e6c79204661726d20697320616c6c6f77656400000000000000000000000060448201526064016104cb565b60026006541415610c1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104cb565b60026006556001600160a01b038216610c775760405162461bcd60e51b815260206004820152601460248201527f5046563a20496e76616c6964206164647265737300000000000000000000000060448201526064016104cb565b60008111610cc75760405162461bcd60e51b815260206004820152600f60248201527f5046563a204e6f7420656e6f756768000000000000000000000000000000000060448201526064016104cb565b60006008805480602002602001604051908101604052809291908181526020018280548015610d1f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d01575b505050505090506000815190506000610d3760025490565b905060005b82811015610e65576000848281518110610d7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b158015610de857600080fd5b505afa158015610dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e209190611fee565b9050600084610e2f89846120f3565b610e3991906120ba565b9050610e4f6001600160a01b0384168a83611a66565b5050508080610e5d906121c7565b915050610d3c565b50600954610e7c906001600160a01b03168561187a565b50506001600655505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610f255760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016104cb565b610f328286868403611381565b506001949350505050565b60003361046b818585611584565b60095474010000000000000000000000000000000000000000900460ff1615610fb65760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016104cb565b600a546001600160a01b031633146110105760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f727900000000000000000000000000000000000000000060448201526064016104cb565b60008451116110615760405162461bcd60e51b815260206004820152601360248201527f456d7074792072657761726420746f6b656e730000000000000000000000000060448201526064016104cb565b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905583516110b3906008906020870190611d4c565b50835160005b818110156111c95760008682815181106110fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020908102919091018101516001600160a01b0381166000908152600790925260409091205490915060ff1680156111765760405162461bcd60e51b815260206004820152601560248201527f546f6b656e73206d75737420626520756e69717565000000000000000000000060448201526064016104cb565b506001600160a01b0316600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055806111c1816121c7565b9150506110b9565b506111d4838561179b565b6111dd8261129f565b5050600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555050565b6005546001600160a01b031633146112755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b61129b61128a6005546001600160a01b031690565b6001600160a01b0384169083611a66565b5050565b6005546001600160a01b031633146112f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104cb565b6001600160a01b0381166113755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104cb565b61137e816119fc565b50565b6001600160a01b0383166113fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0382166114785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461098f57818110156115775760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104cb565b61098f8484848403611381565b6001600160a01b0383166116005760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b03821661167c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0383166000908152602081905260409020548181101561170b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906117429084906120a2565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161178e91815260200190565b60405180910390a361098f565b6001600160a01b0382166117f15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104cb565b806002600082825461180391906120a2565b90915550506001600160a01b038216600090815260208190526040812080548392906118309084906120a2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b038216600090815260208190526040902054818110156119855760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119b4908490612130565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016114cd565b505050565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526119f792869291600091611b24918516908490611bb4565b8051909150156119f75780806020019051810190611b429190611fba565b6119f75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104cb565b6060611bc38484600085611bcb565b949350505050565b606082471015611c435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104cb565b6001600160a01b0385163b611c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104cb565b600080866001600160a01b03168587604051611cb69190612035565b60006040518083038185875af1925050503d8060008114611cf3576040519150601f19603f3d011682016040523d82523d6000602084013e611cf8565b606091505b5091509150611d08828286611d13565b979650505050505050565b60608315611d225750816105f8565b825115611d325782518084602001fd5b8160405162461bcd60e51b81526004016104cb9190612051565b828054828255906000526020600020908101928215611db9579160200282015b82811115611db957825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190611d6c565b50611dc5929150611dc9565b5090565b5b80821115611dc55760008155600101611dca565b80356001600160a01b0381168114611df557600080fd5b919050565b600060208284031215611e0b578081fd5b6105f882611dde565b60008060408385031215611e26578081fd5b611e2f83611dde565b9150611e3d60208401611dde565b90509250929050565b600080600060608486031215611e5a578081fd5b611e6384611dde565b9250611e7160208501611dde565b9150604084013590509250925092565b60008060408385031215611e93578182fd5b611e9c83611dde565b946020939093013593505050565b60008060008060808587031215611ebf578081fd5b843567ffffffffffffffff80821115611ed6578283fd5b818701915087601f830112611ee9578283fd5b8135602082821115611efd57611efd61222f565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715611f4057611f4061222f565b604052838152828101945085830182870184018d1015611f5e578788fd5b8796505b84871015611f8757611f7381611dde565b865260019690960195948301948301611f62565b509850508801359550611fa1925050604087019050611dde565b9150611faf60608601611dde565b905092959194509250565b600060208284031215611fcb578081fd5b81516105f88161225e565b600060208284031215611fe7578081fd5b5035919050565b600060208284031215611fff578081fd5b5051919050565b60008060408385031215612018578182fd5b82359150602083013561202a8161225e565b809150509250929050565b60008251612047818460208701612147565b9190910192915050565b6020815260008251806020840152612070816040850160208701612147565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156120b5576120b5612200565b500190565b6000826120ee577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561212b5761212b612200565b500290565b60008282101561214257612142612200565b500390565b60005b8381101561216257818101518382015260200161214a565b8381111561098f5750506000910152565b600181811c9082168061218757607f821691505b602082108114156121c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156121f9576121f9612200565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461137e57600080fdfea2646970667358221220faea82ec19889de8a73e6a819d5bc2560b8838661cc1dff791566f43520cc61464736f6c6343000804003360a060405234801561001057600080fd5b5061001a3361002a565b600180553360601b60805261007a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805160601c6126146100c2600039600081816102dc01528181610467015281816108010152818161090301528181610b61015281816115df015261172f01526126146000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638ad1071b116100f9578063a9f8d18111610097578063ccd34cd511610071578063ccd34cd5146103ce578063db2e21bc146103d7578063f2fde38b146103df578063f40f0f52146103f257600080fd5b8063a9f8d18114610392578063b6b55f251461039b578063cc7a262e146103ae57600080fd5b806392e8990e116100d357806392e8990e146103515780639513997f146103595780639be65a601461036c578063a0b409051461037f57600080fd5b80638ad1071b146103215780638da5cb5b1461032a5780638f6629151461034857600080fd5b806348cd4cb1116101665780636d0e002c116101405780636d0e002c146102d7578063715018a6146102fe57806380dc06721461030657806383a5041c1461030e57600080fd5b806348cd4cb1146102b85780634a7c01ec146102c157806366fe9f8a146102ce57600080fd5b806331026ce1116101a257806331026ce114610236578063392e53cd1461023e578063448b7a5114610260578063462293a3146102a557600080fd5b80631959a002146101c95780631aed65531461020a5780632e1a7d4d14610221575b600080fd5b6101f06101d7366004612300565b600c602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b61021360045481565b604051908152602001610201565b61023461022f3660046123f0565b610405565b005b610234610692565b60025461025090610100900460ff1681565b6040519015158152602001610201565b600a546102809073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610201565b6102346102b33660046123f0565b6107a4565b61021360055481565b6002546102509060ff1681565b61021360075481565b6102807f000000000000000000000000000000000000000000000000000000000000000081565b610234610a13565b610234610a84565b61023461031c36600461237f565b610af1565b61021360085481565b60005473ffffffffffffffffffffffffffffffffffffffff16610280565b61021360035481565b610250610cb6565b610234610367366004612420565b610ceb565b61023461037a366004612300565b6110e4565b61023461038d366004612354565b6113f7565b61021360065481565b6102346103a93660046123f0565b611582565b600b546102809073ffffffffffffffffffffffffffffffffffffffff1681565b61021360095481565b6102346116d2565b6102346103ed366004612300565b61189e565b610213610400366004612300565b61199a565b6002600154141561045d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105039190612338565b156105505760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b336000908152600c6020526040902080548211156105b05760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610454565b6105b8611b1e565b6000816001015460095460035484600001546105d491906124ff565b6105de91906124c6565b6105e8919061253c565b905082156106235781546105fd90849061253c565b8255600b546106239073ffffffffffffffffffffffffffffffffffffffff163385611c2c565b8015610633576106338133611d05565b600954600354835461064591906124ff565b61064f91906124c6565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600a546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526107a29173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561076457600080fd5b505afa158015610778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079c9190612408565b33611d05565b565b600260015414156107f75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190612338565b156108ea5760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d270586040518163ffffffff1660e01b815260040160206040518083038186803b15801561096757600080fd5b505afa15801561097b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099f919061231c565b73ffffffffffffffffffffffffffffffffffffffff1614610a025760405162461bcd60e51b815260206004820152601160248201527f4f4e4c592050594c4f4e20524f555445520000000000000000000000000000006044820152606401610454565b610a0c8132611d95565b5060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6107a26000611f40565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b43600455565b600254610100900460ff1615610b495760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610454565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610bce5760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f72790000000000000000000000000000000000000000006044820152606401610454565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600b805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600a805492891692909116919091179055600585905560048490558215610c9557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b64e8d4a51000600955600554600655610cad8161189e565b50505050505050565b60025460009060ff161580610cda5750600854600554610cd691906124ae565b4310155b15610ce55750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6005544310610da35760405162461bcd60e51b815260206004820152601060248201527f506f6f6c206861732073746172746564000000000000000000000000000000006044820152606401610454565b808210610e185760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610454565b814310610e8d5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610454565b600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f9190612408565b90506000610f3d848461253c565b610f4f90670de0b6b3a76400006124ff565b90508181146110965781811115610ffd57600a5473ffffffffffffffffffffffffffffffffffffffff1663306a4bf4610f88848461253c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915260016024820152604401600060405180830381600087803b158015610fe057600080fd5b505af1158015610ff4573d6000803e3d6000fd5b50505050611096565b600a5473ffffffffffffffffffffffffffffffffffffffff1663306a4bf4611025838561253c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915260006024820152604401600060405180830381600087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050505b60058490556004839055600684905560408051858152602081018590527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461114b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600b5473ffffffffffffffffffffffffffffffffffffffff828116911614156111dc5760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610454565b600a5473ffffffffffffffffffffffffffffffffffffffff8281169116141561126d5760405162461bcd60e51b815260206004820152602e60248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572205073696f6e60448201527f6963205661756c7420746f6b656e0000000000000000000000000000000000006064820152608401610454565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156112d557600080fd5b505afa1580156112e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130d9190612408565b9050806113825760405162461bcd60e51b815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e6365000000000000000000000000000000000000000000000000006064820152608401610454565b6113a373ffffffffffffffffffffffffffffffffffffffff83163383611c2c565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516113eb91815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461145e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60025460ff166114b05760405162461bcd60e51b815260206004820152600b60248201527f4d757374206265207365740000000000000000000000000000000000000000006044820152606401610454565b81156115115760075481116115075760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610454565b6007819055611543565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c60075460405161157691815260200190565b60405180910390a15050565b600260015414156115d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561164357600080fd5b505afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b9190612338565b156116c85760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b610a0c8133611d95565b600260015414156117255760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b187bd266040518163ffffffff1660e01b815260040160206040518083038186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb9190612338565b156118185760405162461bcd60e51b815260206004820152601560248201527f54686520666163746f72792069732070617573656400000000000000000000006044820152606401610454565b336000908152600c602052604081208054828255600182019290925590801561185f57600b5461185f9073ffffffffffffffffffffffffffffffffffffffff163383611c2c565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b73ffffffffffffffffffffffffffffffffffffffff811661198e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b61199781611f40565b50565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600c6020526040808220600b5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b158015611a1a57600080fd5b505afa158015611a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a529190612408565b905060065443118015611a6457508015155b15611aeb576000611a7760065443611fb5565b611a8990670de0b6b3a76400006124ff565b905060008260095483611a9c91906124ff565b611aa691906124c6565b600354611ab391906124ae565b90508360010154600954828660000154611acd91906124ff565b611ad791906124c6565b611ae1919061253c565b9695505050505050565b60018201546009546003548454611b0291906124ff565b611b0c91906124c6565b611b16919061253c565b949350505050565b6006544311611b2957565b600b546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611b9357600080fd5b505afa158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb9190612408565b905080611bd9575043600655565b6000611be760065443611fb5565b611bf990670de0b6b3a76400006124ff565b90508160095482611c0a91906124ff565b611c1491906124c6565b600354611c2191906124ae565b600355505043600655565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611d009084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611ff6565b505050565b600a546040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820185905290911690639dc29fac90604401600060405180830381600087803b158015611d7957600080fd5b505af1158015611d8d573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c60205260409020611dc2610cb6565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611e0c57506007548154611e0990856124ae565b11155b611e585760405162461bcd60e51b815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d697400000000006044820152606401610454565b611e60611b1e565b805415611eab57600081600101546009546003548460000154611e8391906124ff565b611e8d91906124c6565b611e97919061253c565b90508015611ea957611ea98184611d05565b505b8215611ee5578054611ebe9084906124ae565b8155600b54611ee59073ffffffffffffffffffffffffffffffffffffffff168330866120e8565b6009546003548254611ef791906124ff565b611f0191906124c6565b600182015560405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006004548211611fd157611fca838361253c565b9050611ff0565b6004548310611fe257506000611ff0565b82600454611fca919061253c565b92915050565b6000612058826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661214c9092919063ffffffff16565b805190915015611d0057808060200190518101906120769190612338565b611d005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610454565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526121469085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611c7e565b50505050565b606061215b8484600085612165565b90505b9392505050565b6060824710156121dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610454565b73ffffffffffffffffffffffffffffffffffffffff85163b6122415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610454565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161226a9190612441565b60006040518083038185875af1925050503d80600081146122a7576040519150601f19603f3d011682016040523d82523d6000602084013e6122ac565b606091505b50915091506122bc8282866122c7565b979650505050505050565b606083156122d657508161215e565b8251156122e65782518084602001fd5b8160405162461bcd60e51b8152600401610454919061245d565b600060208284031215612311578081fd5b813561215e816125ae565b60006020828403121561232d578081fd5b815161215e816125ae565b600060208284031215612349578081fd5b815161215e816125d0565b60008060408385031215612366578081fd5b8235612371816125d0565b946020939093013593505050565b600080600080600080600060e0888a031215612399578283fd5b87356123a4816125ae565b965060208801356123b4816125ae565b955060408801359450606088013593506080880135925060a0880135915060c08801356123e0816125ae565b8091505092959891949750929550565b600060208284031215612401578081fd5b5035919050565b600060208284031215612419578081fd5b5051919050565b60008060408385031215612432578182fd5b50508035926020909101359150565b60008251612453818460208701612553565b9190910192915050565b602081526000825180602084015261247c816040850160208701612553565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156124c1576124c161257f565b500190565b6000826124fa577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125375761253761257f565b500290565b60008282101561254e5761254e61257f565b500390565b60005b8381101561256e578181015183820152602001612556565b838111156121465750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461199757600080fd5b801515811461199757600080fdfea2646970667358221220985ffbe62dc6415af0963bc7a6de9ae18900298da89ecd2571783fe31cf3215e64736f6c63430008040033a26469706673582212206b97d7234046f13221dc4415337b2994de8794e1bd34e4958f6c88f7b2d9883e64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MOVR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.