Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 9 internal transactions
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 6302637 | 577 days ago | Contract Creation | 0 FRAX | |||
| 6090709 | 582 days ago | Contract Creation | 0 FRAX | |||
| 6000886 | 584 days ago | Contract Creation | 0 FRAX | |||
| 6000840 | 584 days ago | Contract Creation | 0 FRAX | |||
| 5955349 | 585 days ago | Contract Creation | 0 FRAX | |||
| 5955339 | 585 days ago | Contract Creation | 0 FRAX | |||
| 5955324 | 585 days ago | Contract Creation | 0 FRAX | |||
| 5905298 | 586 days ago | Contract Creation | 0 FRAX | |||
| 4880579 | 610 days ago | Contract Creation | 0 FRAX |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
RevestVeFXS
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity ^0.8.0;
import "./interfaces/IAddressRegistry.sol";
import "./interfaces/IOutputReceiverV3.sol";
import "./interfaces/ITokenVault.sol";
import "./interfaces/IRevest.sol";
import "./interfaces/IFNFTHandler.sol";
import "./interfaces/ILockManager.sol";
import "./interfaces/IRewardsHandler.sol";
import "./interfaces/IVotingEscrow.sol";
import "./interfaces/IFeeReporter.sol";
import "./VestedEscrowSmartWallet.sol";
import "./SmartWalletWhitelistV2.sol";
// OZ imports
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/proxy/Clones.sol";
// Libraries
import "./lib/RevestHelper.sol";
/**
* @title Revest FNFT for veFXS
* @author RobAnon
* @author Ekkila
* @dev
*/
contract RevestVeFXS is IOutputReceiverV3, Ownable, ERC165, IFeeReporter, ReentrancyGuard {
using SafeERC20 for IERC20;
// Where to find the Revest address registry that contains info about what contracts live where
address public addressRegistry;
// Address of voting escrow contract
address public immutable VOTING_ESCROW;
// Token used for voting escrow
address public immutable TOKEN;
address public immutable REWARD_TOKEN;
// Distributor for rewards address
address public immutable DISTRIBUTOR;
// Revest Admin Account
address public ADMIN_WALLET;
// Vault address
address public immutable VAULT;
// Template address for VE wallets
address public immutable TEMPLATE;
// The file which tells our frontend how to visually represent such an FNFT
string public METADATA = "https://revest.mypinata.cloud/ipfs/QmXYdhFqtKFtYW9aEQ8cpPKTm3T1Dv3Hd1uz9ZuYpzeN89";
// Constant used for approval
uint private constant MAX_INT = 2 ** 256 - 1;
uint private constant MAX_LOCKUP = 4 * 365 days;
uint private constant PERCENTAGE = 1000;
// Performance fee
uint private PERFORMANCE_FEE = 100;
// Management fee
uint private MANAGEMENT_FEE = 5;
// Control variable to let all users utilize smart wallets for proxy execution
bool public globalProxyEnabled;
// Control variable to enable a given FNFT to utilize their smart wallet for proxy execution
mapping (uint => bool) public proxyEnabled;
// Mapping fnftId to lockId for each user
mapping (uint => uint128) public lockId;
// Initialize the contract with the needed valeus
constructor(address _provider, address _vE, address _distributor, address _revestAdmin) {
addressRegistry = _provider;
VOTING_ESCROW = _vE;
TOKEN = IVotingEscrow(_vE).token();
REWARD_TOKEN = IVotingEscrow(_vE).token();
DISTRIBUTOR = _distributor;
VestedEscrowSmartWallet wallet = new VestedEscrowSmartWallet(_vE, _distributor);
TEMPLATE = address(wallet);
ADMIN_WALLET = _revestAdmin;
VAULT = IAddressRegistry(_provider).getTokenVault();
}
modifier onlyRevestController() {
require(msg.sender == IAddressRegistry(addressRegistry).getRevest(), 'Unauthorized Access!');
_;
}
modifier onlyTokenHolder(uint fnftId) {
IAddressRegistry reg = IAddressRegistry(addressRegistry);
require(IFNFTHandler(reg.getRevestFNFT()).getBalance(msg.sender, fnftId) > 0, 'E064');
_;
}
// Allows core Revest contracts to make sure this contract can do what is needed
// Mandatory method
function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IOutputReceiver).interfaceId
|| interfaceId == type(IOutputReceiverV2).interfaceId
|| interfaceId == type(IOutputReceiverV3).interfaceId
|| super.supportsInterface(interfaceId);
}
function lockTokens(
uint endTime,
uint amountToLock
) external nonReentrant returns (uint fnftId) {
//Taking management fee
uint fxsFee = amountToLock * MANAGEMENT_FEE / PERCENTAGE; // Make constant
IERC20(TOKEN).safeTransferFrom(msg.sender, ADMIN_WALLET, fxsFee);
amountToLock -= fxsFee;
// TODO: Emit fee claimed event
emit FeeCollection(address(TOKEN), fxsFee);
/// Mint FNFT
{
// Initialize the Revest config object
IRevest.FNFTConfig memory fnftConfig;
// Want FNFT to be extendable and support multiple deposits
fnftConfig.isMulti = true;
fnftConfig.maturityExtension = true;
// Will result in the asset being sent back to this contract upon withdrawal
// Results solely in a callback
fnftConfig.pipeToContract = address(this);
// Set these two arrays according to Revest specifications to say
// Who gets these FNFTs and how many copies of them we should create
address[] memory recipients = new address[](1);
recipients[0] = _msgSender();
uint[] memory quantities = new uint[](1);
quantities[0] = 1;
address revest = IAddressRegistry(addressRegistry).getRevest();
fnftId = IRevest(revest).mintTimeLock(endTime, recipients, quantities, fnftConfig);
}
address smartWallAdd;
{
// We deploy the smart wallet
smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
// Transfer the tokens from the user to the smart wallet
IERC20(TOKEN).safeTransferFrom(msg.sender, smartWallAdd, amountToLock);
// We deposit our funds into the wallet
(uint128 index, uint256 newLockId) = wallet.createLock(amountToLock, endTime);
lockId[fnftId] = index;
emit DepositERC20OutputReceiver(msg.sender, TOKEN, amountToLock, fnftId, abi.encode(smartWallAdd));
}
}
function receiveRevestOutput(
uint fnftId,
address,
address payable owner,
uint
) external override nonReentrant {
// Security check to make sure the Revest vault is the only contract that can call this method
require(_msgSender() == VAULT, 'E016');
address smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
// Claim fee and distribute output
wallet.claimRewards(owner, ADMIN_WALLET, PERFORMANCE_FEE);
// Withdraw the fund
wallet.withdraw(lockId[fnftId]);
uint balance = IERC20(TOKEN).balanceOf(address(this));
IERC20(TOKEN).safeTransfer(owner, balance);
emit WithdrawERC20OutputReceiver(owner, TOKEN, balance, fnftId, abi.encode(smartWallAdd));
}
// Not applicable, as these cannot be split
function handleFNFTRemaps(uint, uint[] memory, address, bool) external pure override {
require(false, 'Not applicable');
}
// Allows custom parameters to be passed during withdrawals
function receiveSecondaryCallback(
uint fnftId,
address payable owner,
uint quantity,
IRevest.FNFTConfig memory config,
bytes memory args
) external payable override {}
// Callback from Revest.sol to extend maturity
function handleTimelockExtensions(uint fnftId, uint expiration, address) external override onlyRevestController {
require(expiration - block.timestamp <= MAX_LOCKUP, 'Max lockup is 4 years');
address smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
wallet.increaseUnlockTime(expiration, lockId[fnftId]);
}
/// Prerequisite: User has approved this contract to spend tokens on their behalf
function handleAdditionalDeposit(uint fnftId, uint amountToDeposit, uint, address caller) external override nonReentrant onlyRevestController {
address smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
//Taking management fee
uint fxsFee = amountToDeposit * MANAGEMENT_FEE / PERCENTAGE; // Make constant
IERC20(TOKEN).safeTransferFrom(caller, ADMIN_WALLET, fxsFee);
amountToDeposit -= fxsFee;
IERC20(TOKEN).safeTransferFrom(caller, smartWallAdd, amountToDeposit);
wallet.increaseAmount(amountToDeposit, lockId[fnftId]);
}
// Not applicable
function handleSplitOperation(uint fnftId, uint[] memory proportions, uint quantity, address caller) external override {}
// Claims rewards on user's behalf
function triggerOutputReceiverUpdate(
uint fnftId,
bytes memory
) external override onlyTokenHolder(fnftId) {
address smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
wallet.claimRewards(msg.sender, ADMIN_WALLET, PERFORMANCE_FEE);
}
function proxyExecute(
uint fnftId,
address destination,
bytes memory data
) external onlyTokenHolder(fnftId) payable returns (bytes memory dataOut) {
require(globalProxyEnabled || proxyEnabled[fnftId], 'Proxy access not enabled!');
address smartWallAdd = Clones.cloneDeterministic(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
VestedEscrowSmartWallet wallet = VestedEscrowSmartWallet(smartWallAdd);
dataOut = wallet.proxyExecute{value: msg.value}(destination, data);
wallet.cleanMemory();
}
/// Admin Functions
function setAddressRegistry(address addressRegistry_) external override onlyOwner {
addressRegistry = addressRegistry_;
}
function setRevestAdmin(address _admin) external onlyOwner {
ADMIN_WALLET = _admin;
}
function setMetadata(string memory _meta) external onlyOwner {
METADATA = _meta;
}
function setGlobalProxyEnabled(bool enable) external onlyOwner {
globalProxyEnabled = enable;
}
function setProxyStatusForFNFT(uint fnftId, bool status) external onlyOwner {
proxyEnabled[fnftId] = status;
}
function setPerformanceFee(uint fee) external onlyOwner {
PERFORMANCE_FEE = fee;
}
function setManagementFee(uint fee) external onlyOwner {
MANAGEMENT_FEE = fee;
}
/// If funds are mistakenly sent to smart wallets, this will allow the owner to assist in rescue
function rescueNativeFunds() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
/// Under no circumstances should this contract ever contain ERC-20 tokens at the end of a transaction
/// If it does, someone has mistakenly sent funds to the contract, and this function can rescue their tokens
function rescueERC20(address token) external onlyOwner {
uint amount = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransfer(msg.sender, amount);
}
/// View Functions
function getCustomMetadata(uint) external view override returns (string memory) {
return METADATA;
}
// Will give balance in veFXS
function getValue(uint fnftId) public view override returns (uint) {
return IVotingEscrow(VOTING_ESCROW).balanceOf(Clones.predictDeterministicAddress(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId))));
}
// Must always be in native token
function getAsset(uint) external view override returns (address) {
return VOTING_ESCROW;
}
function getOutputDisplayValues(uint fnftId) external view override returns (bytes memory displayData) {
//calculate yield output for certain FNFT
uint yield = IYieldDistributor(DISTRIBUTOR).earned(Clones.predictDeterministicAddress(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId))));
bool hasRewards = (yield > 0) ? true : false;
//Making string to output
string memory rewardsDesc;
if(hasRewards) {
string memory par1 = string(abi.encodePacked(RevestHelper.getName(REWARD_TOKEN),": "));
string memory par2 = string(abi.encodePacked(RevestHelper.amountToDecimal(yield, REWARD_TOKEN), " [", RevestHelper.getTicker(REWARD_TOKEN), "] Tokens Available"));
rewardsDesc = string(abi.encodePacked(par1, par2));
}
address smartWallet = getAddressForFNFT(fnftId);
uint maxExtension = block.timestamp / (1 weeks) * (1 weeks) + MAX_LOCKUP; //Ensures no confusion with time zones and date-selectors
(int128 lockedBalance, ) = IVotingEscrow(VOTING_ESCROW).lockedByIndex(smartWallet, lockId[fnftId]);
displayData = abi.encode(smartWallet, rewardsDesc, hasRewards, maxExtension, TOKEN, lockedBalance);
}
function getAddressRegistry() external view override returns (address) {
return addressRegistry;
}
function getRevest() internal view returns (IRevest) {
return IRevest(IAddressRegistry(addressRegistry).getRevest());
}
function getFlatWeiFee(address) external view override returns (uint) {
return PERFORMANCE_FEE;
}
function getERC20Fee(address) external view override returns (uint) {
return MANAGEMENT_FEE;
}
function getAddressForFNFT(uint fnftId) public view returns (address smartWallAdd) {
smartWallAdd = Clones.predictDeterministicAddress(TEMPLATE, keccak256(abi.encode(TOKEN, fnftId)));
}
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
/**
* @title Provider interface for Revest FNFTs
* @dev
*
*/
interface IAddressRegistry {
function initialize(
address lock_manager_,
address liquidity_,
address revest_token_,
address token_vault_,
address revest_,
address fnft_,
address metadata_,
address admin_,
address rewards_
) external;
function getAdmin() external view returns (address);
function setAdmin(address admin) external;
function getLockManager() external view returns (address);
function setLockManager(address manager) external;
function getTokenVault() external view returns (address);
function setTokenVault(address vault) external;
function getRevestFNFT() external view returns (address);
function setRevestFNFT(address fnft) external;
function getMetadataHandler() external view returns (address);
function setMetadataHandler(address metadata) external;
function getRevest() external view returns (address);
function setRevest(address revest) external;
function getDEX(uint index) external view returns (address);
function setDex(address dex) external;
function getRevestToken() external view returns (address);
function setRevestToken(address token) external;
function getRewardsHandler() external view returns(address);
function setRewardsHandler(address esc) external;
function getAddress(bytes32 id) external view returns (address);
function getLPs() external view returns (address);
function setLPs(address liquidToken) external;
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IOutputReceiverV2.sol";
/**
* @title Provider interface for Revest FNFTs
*/
interface IOutputReceiverV3 is IOutputReceiverV2 {
event DepositERC20OutputReceiver(address indexed mintTo, address indexed token, uint amountTokens, uint indexed fnftId, bytes extraData);
event DepositERC721OutputReceiver(address indexed mintTo, address indexed token, uint[] tokenIds, uint indexed fnftId, bytes extraData);
event DepositERC1155OutputReceiver(address indexed mintTo, address indexed token, uint tokenId, uint amountTokens, uint indexed fnftId, bytes extraData);
event WithdrawERC20OutputReceiver(address indexed caller, address indexed token, uint amountTokens, uint indexed fnftId, bytes extraData);
event WithdrawERC721OutputReceiver(address indexed caller, address indexed token, uint[] tokenIds, uint indexed fnftId, bytes extraData);
event WithdrawERC1155OutputReceiver(address indexed caller, address indexed token, uint tokenId, uint amountTokens, uint indexed fnftId, bytes extraData);
function handleTimelockExtensions(uint fnftId, uint expiration, address caller) external;
function handleAdditionalDeposit(uint fnftId, uint amountToDeposit, uint quantity, address caller) external;
function handleSplitOperation(uint fnftId, uint[] memory proportions, uint quantity, address caller) external;
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IRevest.sol";
interface ITokenVault {
function createFNFT(
uint fnftId,
IRevest.FNFTConfig memory fnftConfig,
uint quantity,
address from
) external;
function withdrawToken(
uint fnftId,
uint quantity,
address user
) external;
function depositToken(
uint fnftId,
uint amount,
uint quantity
) external;
function cloneFNFTConfig(IRevest.FNFTConfig memory old) external returns (IRevest.FNFTConfig memory);
function mapFNFTToToken(
uint fnftId,
IRevest.FNFTConfig memory fnftConfig
) external;
function handleMultipleDeposits(
uint fnftId,
uint newFNFTId,
uint amount
) external;
function splitFNFT(
uint fnftId,
uint[] memory newFNFTIds,
uint[] memory proportions,
uint quantity
) external;
function getFNFT(uint fnftId) external view returns (IRevest.FNFTConfig memory);
function getFNFTCurrentValue(uint fnftId) external view returns (uint);
function getNontransferable(uint fnftId) external view returns (bool);
function getSplitsRemaining(uint fnftId) external view returns (uint);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
interface IRevest {
event FNFTTimeLockMinted(
address indexed asset,
address indexed from,
uint indexed fnftId,
uint endTime,
uint[] quantities,
FNFTConfig fnftConfig
);
event FNFTValueLockMinted(
address indexed asset,
address indexed from,
uint indexed fnftId,
address compareTo,
address oracleDispatch,
uint[] quantities,
FNFTConfig fnftConfig
);
event FNFTAddressLockMinted(
address indexed asset,
address indexed from,
uint indexed fnftId,
address trigger,
uint[] quantities,
FNFTConfig fnftConfig
);
event FNFTWithdrawn(
address indexed from,
uint indexed fnftId,
uint indexed quantity
);
event FNFTSplit(
address indexed from,
uint[] indexed newFNFTId,
uint[] indexed proportions,
uint quantity
);
event FNFTUnlocked(
address indexed from,
uint indexed fnftId
);
event FNFTMaturityExtended(
address indexed from,
uint indexed fnftId,
uint indexed newExtendedTime
);
event FNFTAddionalDeposited(
address indexed from,
uint indexed newFNFTId,
uint indexed quantity,
uint amount
);
struct FNFTConfig {
address asset; // The token being stored
address pipeToContract; // Indicates if FNFT will pipe to another contract
uint depositAmount; // How many tokens
uint depositMul; // Deposit multiplier
uint split; // Number of splits remaining
uint depositStopTime; //
bool maturityExtension; // Maturity extensions remaining
bool isMulti; //
bool nontransferrable; // False by default (transferrable) //
}
// Refers to the global balance for an ERC20, encompassing possibly many FNFTs
struct TokenTracker {
uint lastBalance;
uint lastMul;
}
enum LockType {
DoesNotExist,
TimeLock,
ValueLock,
AddressLock
}
struct LockParam {
address addressLock;
uint timeLockExpiry;
LockType lockType;
ValueLock valueLock;
}
struct Lock {
address addressLock;
LockType lockType;
ValueLock valueLock;
uint timeLockExpiry;
uint creationTime;
bool unlocked;
}
struct ValueLock {
address asset;
address compareTo;
address oracle;
uint unlockValue;
bool unlockRisingEdge;
}
function mintTimeLock(
uint endTime,
address[] memory recipients,
uint[] memory quantities,
IRevest.FNFTConfig memory fnftConfig
) external payable returns (uint);
function mintValueLock(
address primaryAsset,
address compareTo,
uint unlockValue,
bool unlockRisingEdge,
address oracleDispatch,
address[] memory recipients,
uint[] memory quantities,
IRevest.FNFTConfig memory fnftConfig
) external payable returns (uint);
function mintAddressLock(
address trigger,
bytes memory arguments,
address[] memory recipients,
uint[] memory quantities,
IRevest.FNFTConfig memory fnftConfig
) external payable returns (uint);
function withdrawFNFT(uint tokenUID, uint quantity) external;
function unlockFNFT(uint tokenUID) external;
function splitFNFT(
uint fnftId,
uint[] memory proportions,
uint quantity
) external returns (uint[] memory newFNFTIds);
function depositAdditionalToFNFT(
uint fnftId,
uint amount,
uint quantity
) external returns (uint);
function extendFNFTMaturity(
uint fnftId,
uint endTime
) external returns (uint);
function setFlatWeiFee(uint wethFee) external;
function setERC20Fee(uint erc20) external;
function getFlatWeiFee() external view returns (uint);
function getERC20Fee() external view returns (uint);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
interface IFNFTHandler {
function mint(address account, uint id, uint amount, bytes memory data) external;
function mintBatchRec(address[] memory recipients, uint[] memory quantities, uint id, uint newSupply, bytes memory data) external;
function mintBatch(address to, uint[] memory ids, uint[] memory amounts, bytes memory data) external;
function setURI(string memory newuri) external;
function burn(address account, uint id, uint amount) external;
function burnBatch(address account, uint[] memory ids, uint[] memory amounts) external;
function getBalance(address tokenHolder, uint id) external view returns (uint);
function getSupply(uint fnftId) external view returns (uint);
function getNextId() external view returns (uint);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IRevest.sol";
interface ILockManager {
function createLock(uint fnftId, IRevest.LockParam memory lock) external returns (uint);
function getLock(uint lockId) external view returns (IRevest.Lock memory);
function fnftIdToLockId(uint fnftId) external view returns (uint);
function fnftIdToLock(uint fnftId) external view returns (IRevest.Lock memory);
function pointFNFTToLock(uint fnftId, uint lockId) external;
function lockTypes(uint tokenId) external view returns (IRevest.LockType);
function unlockFNFT(uint fnftId, address sender) external returns (bool);
function getLockMaturity(uint fnftId) external view returns (bool);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
interface IRewardsHandler {
struct UserBalance {
uint allocPoint; // Allocation points
uint lastMul;
}
function receiveFee(address token, uint amount) external;
function updateLPShares(uint fnftId, uint newShares) external;
function updateBasicShares(uint fnftId, uint newShares) external;
function getAllocPoint(uint fnftId, address token, bool isBasic) external view returns (uint);
function claimRewards(uint fnftId, address caller) external returns (uint);
function setStakingContract(address stake) external;
function getRewards(uint fnftId, address token) external view returns (uint);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IRegistryProvider.sol";
import '@openzeppelin/contracts/utils/introspection/IERC165.sol';
/**
* @title Provider interface for Revest FNFTs
*/
interface IVotingEscrow {
struct Point {
int128 bias;
int128 slope;
uint ts;
uint blk;
}
function createLock(address _addr, uint256 _value, uint128 _unlock_time) external returns (uint128, uint256);
function increaseAmount(uint _value, uint128 _lockIndex) external;
function increaseUnlockTime(uint128 _unlock_time, uint128 _lockIndex) external;
function withdraw(uint128 _lockIndex) external;
function token() external view returns (address tok);
function lockedByIndex(address _addr, uint128 index) external view returns (int128 amount, uint256 end);
function balanceOf(address _addr) external view returns (uint balance);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
interface IFeeReporter {
function getFlatWeiFee(address asset) external view returns (uint);
function getERC20Fee(address asset) external view returns (uint);
event FeeCollection(address indexed token, uint indexed amount);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
import "./interfaces/IVotingEscrow.sol";
import "./interfaces/IRewardsHandler.sol";
import "./interfaces/IYieldDistributor.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../lib/forge-std/src/console.sol";
pragma solidity ^0.8.0;
/// @author RobAnon
contract VestedEscrowSmartWallet {
using SafeERC20 for IERC20;
uint private constant MAX_INT = 2 ** 256 - 1;
address private immutable MASTER;
address private immutable LOCK_TOKEN;
address private immutable REWARD_TOKEN;
address private immutable VOTING_ESCROW;
address private immutable DISTRIBUTOR;
uint private constant PERCENTAGE = 1000;
constructor(address _votingEscrow, address _distributor) {
MASTER = msg.sender;
VOTING_ESCROW = _votingEscrow;
LOCK_TOKEN = IVotingEscrow(_votingEscrow).token();
REWARD_TOKEN = IVotingEscrow(_votingEscrow).token();
DISTRIBUTOR = _distributor;
}
modifier onlyMaster() {
require(msg.sender == MASTER, 'Unauthorized!');
_;
}
function createLock(uint value, uint unlockTime) external onlyMaster returns (uint128 _index, uint256 _newLockId){
// Only callable from the parent contract, transfer tokens from user -> parent, parent -> VE
// Single-use approval system
if(IERC20(LOCK_TOKEN).allowance(address(this), VOTING_ESCROW) != MAX_INT) {
IERC20(LOCK_TOKEN).approve(VOTING_ESCROW, MAX_INT);
}
// Create the lock
(_index, _newLockId) = IVotingEscrow(VOTING_ESCROW).createLock(address(this), value, uint128(unlockTime));
IYieldDistributor(DISTRIBUTOR).checkpoint();
}
function increaseAmount(uint value, uint128 lockId) external onlyMaster {
IVotingEscrow(VOTING_ESCROW).increaseAmount(value, lockId);
IYieldDistributor(DISTRIBUTOR).checkpoint();
_cleanMemory();
}
function increaseUnlockTime(uint unlockTime, uint128 lockId) external onlyMaster {
IVotingEscrow(VOTING_ESCROW).increaseUnlockTime(uint128(unlockTime), lockId);
IYieldDistributor(DISTRIBUTOR).checkpoint();
_cleanMemory();
}
function withdraw(uint128 lockId) external onlyMaster {
address token = IVotingEscrow(VOTING_ESCROW).token();
IVotingEscrow(VOTING_ESCROW).withdraw(lockId);
uint bal = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransfer(MASTER, bal);
_cleanMemory();
}
function claimRewards(
address caller,
address rewards,
uint performanceFee //address that receives the fee
) external onlyMaster {
//Claim yield from yieldDistributor to smart wallet
IYieldDistributor(DISTRIBUTOR).getYield();
//claiming fee
uint bal = IERC20(REWARD_TOKEN).balanceOf(address(this));
uint fee = bal * performanceFee / PERCENTAGE;
bal -= fee;
IERC20(REWARD_TOKEN).safeTransfer(rewards, fee);
console.log("Fee in claimRewards: ", fee);
emit FeeCollection(REWARD_TOKEN, fee);
//distribute yield claim
IERC20(REWARD_TOKEN).safeTransfer(caller, bal);
_cleanMemory();
}
/// Proxy function to send arbitrary messages. Useful for delegating votes and similar activities
function proxyExecute(
address destination,
bytes memory data
) external payable onlyMaster returns (bytes memory dataOut) {
(bool success, bytes memory dataTemp)= destination.call{value:msg.value}(data);
require(success, 'Proxy call failed!');
dataOut = dataTemp;
}
/// Self-destructing clone pattern
function cleanMemory() external onlyMaster {
_cleanMemory();
}
function _cleanMemory() internal {
selfdestruct(payable(MASTER));
}
event FeeCollection(address indexed token, uint indexed amount);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity ^0.8.0;
interface SmartWalletChecker {
function check(address) external view returns (bool);
}
/// @author RobAnon
contract SmartWalletWhitelistV2 {
mapping(address => bool) public wallets;
bytes32 public constant ADMIN = "ADMIN";
bytes32 public constant SUPER_ADMIN = "SUPER_ADMIN";
mapping(address => bytes32) public roles;
address public checker;
address public future_checker;
event ApproveWallet(address);
event RevokeWallet(address);
constructor(address _admin) {
roles[_admin] = ADMIN;
roles[msg.sender] = SUPER_ADMIN;
}
function commitSetChecker(address _checker) external {
require(isAdmin(msg.sender), "!admin");
future_checker = _checker;
}
function changeAdmin(address _admin, bool validAdmin) external {
require(isAdmin(msg.sender), "!admin");
require(!isSuperAdmin(_admin), "!auth"); // Overwrite protection
if(validAdmin) {
roles[_admin] = ADMIN;
} else {
roles[_admin] = 0x0;
}
}
function transferSuperAdmin(address _newAdmin) external {
require(isSuperAdmin(msg.sender),'!sAdmin');
roles[msg.sender] = 0x0;
roles[_newAdmin] = SUPER_ADMIN;
}
function applySetChecker() external {
require(isAdmin(msg.sender), "!admin");
checker = future_checker;
}
function approveWallet(address _wallet) public {
require(isAdmin(msg.sender), "!admin");
wallets[_wallet] = true;
emit ApproveWallet(_wallet);
}
function batchApproveWallets(address[] memory _wallets) public {
require(isAdmin(msg.sender), "!admin");
for(uint i = 0; i < _wallets.length; i++) {
wallets[_wallets[i]] = true;
emit ApproveWallet(_wallets[i]);
}
}
function revokeWallet(address _wallet) external {
require(isAdmin(msg.sender), "!admin");
wallets[_wallet] = false;
emit RevokeWallet(_wallet);
}
function check(address _wallet) external view returns (bool) {
bool _check = wallets[_wallet];
if (_check) {
return _check;
} else {
if (checker != address(0)) {
return SmartWalletChecker(checker).check(_wallet);
}
}
return false;
}
function isAdmin(address checkAdd) internal view returns (bool valid) {
valid = roles[checkAdd] == ADMIN || roles[checkAdd] == SUPER_ADMIN;
}
function isSuperAdmin(address checkAdd) internal view returns (bool valid) {
valid = roles[checkAdd] == SUPER_ADMIN;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
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;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
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;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
instance := create(0, ptr, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
instance := create2(0, ptr, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
mstore(add(ptr, 0x38), shl(0x60, deployer))
mstore(add(ptr, 0x4c), salt)
mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
predicted := keccak256(add(ptr, 0x37), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity ^0.8.0;
import "../interfaces/ITokenVault.sol";
import "../interfaces/ILockManager.sol";
import "../interfaces/IRevest.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
library RevestHelper {
function boolToString(bool arg) internal pure returns (string memory boolean) {
boolean = arg ? "true" : "false";
}
function getLockType(IRevest.LockType lock) internal pure returns (string memory lockType) {
if(lock == IRevest.LockType.TimeLock) {
lockType = "Time";
}
if(lock == IRevest.LockType.TimeLock) {
lockType = "Value";
}
if(lock == IRevest.LockType.TimeLock) {
lockType = "Address";
}
}
function getTicker(address asset) internal view returns (string memory ticker) {
try IERC20Metadata(asset).symbol() returns (string memory tick) {
ticker = tick;
} catch {
ticker = '???';
}
}
function getName(address asset) internal view returns (string memory ticker) {
try IERC20Metadata(asset).name() returns (string memory tick) {
ticker = tick;
} catch {
ticker = 'Unknown Token';
}
}
function amountToDecimal(uint amt, address asset) internal view returns (string memory decStr) {
uint8 decimals;
try IERC20Metadata(asset).decimals() returns (uint8 dec) {
decimals = dec;
} catch {
decimals = 18;
}
decStr = decimalString(amt, decimals);
}
function toString(uint _i) internal pure returns (string memory _uintAsString) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len;
while (_i != 0) {
k = k-1;
uint8 temp = (48 + uint8(_i - _i / 10 * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
_i /= 10;
}
return string(bstr);
}
function decimalString(uint256 number, uint8 decimals) internal pure returns(string memory){
uint256 tenPowDecimals = 10 ** decimals;
uint256 temp = number;
uint8 digits;
uint8 numSigfigs;
while (temp != 0) {
if (numSigfigs > 0) {
// count all digits preceding least significant figure
numSigfigs++;
} else if (temp % 10 != 0) {
numSigfigs++;
}
digits++;
temp /= 10;
}
DecimalStringParams memory params;
if((digits - numSigfigs) >= decimals) {
// no decimals, ensure we preserve all trailing zeros
params.sigfigs = number / tenPowDecimals;
params.sigfigIndex = digits - decimals;
params.bufferLength = params.sigfigIndex;
} else {
// chop all trailing zeros for numbers with decimals
params.sigfigs = number / (10 ** (digits - numSigfigs));
if(tenPowDecimals > number){
// number is less tahn one
// in this case, there may be leading zeros after the decimal place
// that need to be added
// offset leading zeros by two to account for leading '0.'
params.zerosStartIndex = 2;
params.zerosEndIndex = decimals - digits + 2;
params.sigfigIndex = numSigfigs + params.zerosEndIndex;
params.bufferLength = params.sigfigIndex;
params.isLessThanOne = true;
} else {
// In this case, there are digits before and
// after the decimal place
params.sigfigIndex = numSigfigs + 1;
params.decimalIndex = digits - decimals + 1;
}
}
params.bufferLength = params.sigfigIndex;
return generateDecimalString(params);
}
// With modifications, the below taken
// from https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/NFTDescriptor.sol#L189-L231
struct DecimalStringParams {
// significant figures of decimal
uint256 sigfigs;
// length of decimal string
uint8 bufferLength;
// ending index for significant figures (funtion works backwards when copying sigfigs)
uint8 sigfigIndex;
// index of decimal place (0 if no decimal)
uint8 decimalIndex;
// start index for trailing/leading 0's for very small/large numbers
uint8 zerosStartIndex;
// end index for trailing/leading 0's for very small/large numbers
uint8 zerosEndIndex;
// true if decimal number is less than one
bool isLessThanOne;
}
function generateDecimalString(DecimalStringParams memory params) private pure returns (string memory) {
bytes memory buffer = new bytes(params.bufferLength);
if (params.isLessThanOne) {
buffer[0] = '0';
buffer[1] = '.';
}
// add leading/trailing 0's
for (uint256 zerosCursor = params.zerosStartIndex; zerosCursor < params.zerosEndIndex; zerosCursor++) {
buffer[zerosCursor] = bytes1(uint8(48));
}
// add sigfigs
while (params.sigfigs > 0) {
if (params.decimalIndex > 0 && params.sigfigIndex == params.decimalIndex) {
buffer[--params.sigfigIndex] = '.';
}
buffer[--params.sigfigIndex] = bytes1(uint8(uint256(48) + (params.sigfigs % 10)));
params.sigfigs /= 10;
}
return string(buffer);
}
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IOutputReceiver.sol";
import "./IRevest.sol";
import '@openzeppelin/contracts/utils/introspection/IERC165.sol';
/**
* @title Provider interface for Revest FNFTs
*/
interface IOutputReceiverV2 is IOutputReceiver {
// Future proofing for secondary callbacks during withdrawal
// Could just use triggerOutputReceiverUpdate and call withdrawal function
// But deliberately using reentry is poor form and reminds me too much of OAuth 2.0
function receiveSecondaryCallback(
uint fnftId,
address payable owner,
uint quantity,
IRevest.FNFTConfig memory config,
bytes memory args
) external payable;
// Allows for similar function to address lock, updating state while still locked
// Called by the user directly
function triggerOutputReceiverUpdate(
uint fnftId,
bytes memory args
) external;
// This function should only ever be called when a split or additional deposit has occurred
function handleFNFTRemaps(uint fnftId, uint[] memory newFNFTIds, address caller, bool cleanup) external;
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity ^0.8.0;
interface IRegistryProvider {
function setAddressRegistry(address revest) external;
function getAddressRegistry() external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
interface IYieldDistributor {
function earned(address account) external view returns (uint256);
function getYield() external returns (uint256 yield0);
function yields(address) external view returns (uint256 yield0);
function checkpoint() external;
function checkpointOtherUser(address user_addr) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
}
function logUint(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
}
function log(uint p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
}
function log(uint p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
}
function log(uint p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
}
function log(string memory p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
}
function log(uint p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
}
function log(uint p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
}
function log(uint p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
}
function log(uint p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
}
function log(uint p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
}
function log(uint p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
}
function log(uint p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
}
function log(uint p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
}
function log(uint p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
}
function log(uint p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
}
function log(uint p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
}
function log(uint p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
}
function log(uint p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
}
function log(uint p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
}
function log(uint p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
}
function log(string memory p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
}
function log(string memory p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
}
function log(string memory p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
}
function log(string memory p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
}
function log(bool p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
}
function log(bool p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
}
function log(bool p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
}
function log(address p0, uint p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
}
function log(address p0, uint p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
}
function log(address p0, uint p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
}
function log(uint p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private 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
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: GNU-GPL v3.0 or later
pragma solidity >=0.8.0;
import "./IRegistryProvider.sol";
import '@openzeppelin/contracts/utils/introspection/IERC165.sol';
/**
* @title Provider interface for Revest FNFTs
*/
interface IOutputReceiver is IRegistryProvider, IERC165 {
function receiveRevestOutput(
uint fnftId,
address asset,
address payable owner,
uint quantity
) external;
function getCustomMetadata(uint fnftId) external view returns (string memory);
function getValue(uint fnftId) external view returns (uint);
function getAsset(uint fnftId) external view returns (address);
function getOutputDisplayValues(uint fnftId) external view returns (bytes memory);
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"@ensdomains/=node_modules/@ensdomains/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@uniswap/=node_modules/@uniswap/",
"base64-sol/=node_modules/base64-sol/",
"hardhat-deploy/=node_modules/hardhat-deploy/",
"hardhat/=node_modules/hardhat/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_provider","type":"address"},{"internalType":"address","name":"_vE","type":"address"},{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"address","name":"_revestAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintTo","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"DepositERC1155OutputReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintTo","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"DepositERC20OutputReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintTo","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"DepositERC721OutputReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"WithdrawERC1155OutputReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"WithdrawERC20OutputReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":true,"internalType":"uint256","name":"fnftId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"WithdrawERC721OutputReceiver","type":"event"},{"inputs":[],"name":"ADMIN_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEMPLATE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTING_ESCROW","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getAddressForFNFT","outputs":[{"internalType":"address","name":"smartWallAdd","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAddressRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getCustomMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getERC20Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getFlatWeiFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getOutputDisplayValues","outputs":[{"internalType":"bytes","name":"displayData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalProxyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"amountToDeposit","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"handleAdditionalDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"handleFNFTRemaps","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256[]","name":"proportions","type":"uint256[]"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"handleSplitOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"handleTimelockExtensions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockId","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"amountToLock","type":"uint256"}],"name":"lockTokens","outputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proxyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"proxyExecute","outputs":[{"internalType":"bytes","name":"dataOut","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"receiveRevestOutput","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"pipeToContract","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"depositMul","type":"uint256"},{"internalType":"uint256","name":"split","type":"uint256"},{"internalType":"uint256","name":"depositStopTime","type":"uint256"},{"internalType":"bool","name":"maturityExtension","type":"bool"},{"internalType":"bool","name":"isMulti","type":"bool"},{"internalType":"bool","name":"nontransferrable","type":"bool"}],"internalType":"struct IRevest.FNFTConfig","name":"config","type":"tuple"},{"internalType":"bytes","name":"args","type":"bytes"}],"name":"receiveSecondaryCallback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueNativeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressRegistry_","type":"address"}],"name":"setAddressRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setGlobalProxyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setManagementFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_meta","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setProxyStatusForFNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setRevestAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"triggerOutputReceiverUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101c0604052605161014081815290620056a6610160396004906200002590826200037b565b50606460055560056006553480156200003d57600080fd5b50604051620056f7380380620056f7833981016040819052620000609162000464565b6200006b3362000278565b60018055600280546001600160a01b0319166001600160a01b03868116919091179091558316608081905260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa158015620000d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000f89190620004c1565b6001600160a01b031660a0816001600160a01b031681525050826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000150573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001769190620004c1565b6001600160a01b0390811660c052821660e052604051600090849084906200019e90620002c8565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015620001d2573d6000803e3d6000fd5b506001600160a01b0381811661012052600380546001600160a01b031916858316179055604080516354f2f7af60e01b81529051929350908716916354f2f7af916004808201926020929091908290030181865afa15801562000239573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025f9190620004c1565b6001600160a01b03166101005250620004e69350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61157d806200412983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200030157607f821691505b6020821081036200032257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037657600081815260208120601f850160051c81016020861015620003515750805b601f850160051c820191505b8181101562000372578281556001016200035d565b5050505b505050565b81516001600160401b03811115620003975762000397620002d6565b620003af81620003a88454620002ec565b8462000328565b602080601f831160018114620003e75760008415620003ce5750858301515b600019600386901b1c1916600185901b17855562000372565b600085815260208120601f198616915b828110156200041857888601518255948401946001909101908401620003f7565b5085821015620004375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b03811681146200045f57600080fd5b919050565b600080600080608085870312156200047b57600080fd5b620004868562000447565b9350620004966020860162000447565b9250620004a66040860162000447565b9150620004b66060860162000447565b905092959194509250565b600060208284031215620004d457600080fd5b620004df8262000447565b9392505050565b60805160a05160c05160e0516101005161012051613af762000632600039600081816105fd0152818161097d01528181610b7c01528181610df601528181611230015281816117090152818161190901528181611cd601528181611fbe01526121d80152600081816104920152611c790152600081816106c101526118d801526000818161068d015281816119e901528181611a360152611a5f0152600081816105a90152818161099e01528181610b9d01528181610e1701528181610e8001528181610ec401528181611251015281816114a1015281816114db0152818161172a0152818161176b015281816118690152818161192a01528181611bbc01528181611cf701528181611e2901528181611eac01528181611ed601528181611fdf01526121f901526000818161034f015281816107e10152818161094b0152611b470152613af76000f3fe6080604052600436106102515760003560e01c80637e5af5b811610139578063aca1c665116100b6578063d25514121161007a578063d2551412146107a3578063eac8f5b8146107c3578063f2fde38b14610803578063f3ad65f414610823578063f48fe05014610843578063fe56e2321461085857600080fd5b8063aca1c66514610703578063b4927da314610723578063ba156bcb14610743578063c2cd4a0714610763578063ccec37161461078357600080fd5b80638da5cb5b116100fd5780638da5cb5b1461063d5780638ecacb1b1461065b57806399248ea71461067b5780639c26149f146106af578063a49a1e7d146106e357600080fd5b80637e5af5b81461057d57806382bfefc81461059757806389158d8e146105cb5780638bfd9174146105eb5780638d9d67051461061f57600080fd5b806327c7812c116101d2578063609d1fb311610196578063609d1fb3146104d4578063644bf7d8146104e757806370897b2314610507578063715018a61461052757806376da63f31461053c5780637d1b15dd1461055d57600080fd5b806327c7812c1461042957806338c3df07146104495780633ea5665f1461045e578063411557d11461048057806344f5c938146104b457600080fd5b80631d145721116102195780631d1457211461031d5780631f87f3331461033d5780631fd2cf06146103895780632036e7ce146103b95780632799cde0146103db57600080fd5b806301ffc9a714610256578063063c27f81461028b5780630ff4c916146102a25780631355f7ab146102d057806316f49e8a146102f0575b600080fd5b34801561026257600080fd5b50610276610271366004612ce6565b610878565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a06108e5565b005b3480156102ae57600080fd5b506102c26102bd366004612d10565b610947565b604051908152602001610282565b3480156102dc57600080fd5b506102a06102eb366004612d49565b610a52565b3480156102fc57600080fd5b5061031061030b366004612d10565b610c6f565b6040516102829190612dd2565b34801561032957600080fd5b506102a0610338366004612de5565b610d03565b34801561034957600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610282565b34801561039557600080fd5b506102766103a4366004612d10565b60086020526000908152604090205460ff1681565b3480156103c557600080fd5b506102c26103d4366004612e26565b5060065490565b3480156103e757600080fd5b506104116103f6366004612d10565b6009602052600090815260409020546001600160801b031681565b6040516001600160801b039091168152602001610282565b34801561043557600080fd5b506102a0610444366004612e26565b610f73565b34801561045557600080fd5b50610310610fbf565b34801561046a57600080fd5b506102c2610479366004612e26565b5060055490565b34801561048c57600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c057600080fd5b506102a06104cf366004612e26565b61104d565b6103106104e2366004612f37565b611099565b3480156104f357600080fd5b506102a061050236600461301c565b61135e565b34801561051357600080fd5b506102a0610522366004612d10565b611397565b34801561053357600080fd5b506102a06113c6565b34801561054857600080fd5b506102a061055736600461307c565b50505050565b34801561056957600080fd5b506102a06105783660046130d3565b6113fc565b34801561058957600080fd5b506007546102769060ff1681565b3480156105a357600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d757600080fd5b506102c26105e6366004613103565b611446565b3480156105f757600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b34801561062b57600080fd5b506002546001600160a01b0316610371565b34801561064957600080fd5b506000546001600160a01b0316610371565b34801561066757600080fd5b50610310610676366004612d10565b6118d2565b34801561068757600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b3480156106bb57600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ef57600080fd5b506102a06106fe366004613125565b611c0d565b34801561070f57600080fd5b506102a061071e36600461316d565b611c47565b34801561072f57600080fd5b506102a061073e3660046131b5565b611f7a565b34801561074f57600080fd5b5061037161075e366004612d10565b611fb7565b34801561076f57600080fd5b50600354610371906001600160a01b031681565b34801561078f57600080fd5b506102a061079e366004612e26565b612010565b3480156107af57600080fd5b506102a06107be3660046131d2565b6120bb565b3480156107cf57600080fd5b506103716107de366004612d10565b507f000000000000000000000000000000000000000000000000000000000000000090565b34801561080f57600080fd5b506102a061081e366004612e26565b6122a7565b34801561082f57600080fd5b50600254610371906001600160a01b031681565b6102a0610851366004613218565b5050505050565b34801561086457600080fd5b506102a0610873366004612d10565b61233f565b60006001600160e01b031982166368d1d7ad60e11b14806108a957506001600160e01b0319821663214881cd60e11b145b806108c457506001600160e01b0319821663789bc37960e01b145b806108df57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146109185760405162461bcd60e51b815260040161090f9061331d565b60405180910390fd5b60405133904780156108fc02916000818181858888f19350505050158015610944573d6000803e3d6000fd5b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a082316109ea7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866040516020016109cf929190613352565b6040516020818303038152906040528051906020012061236e565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df919061336b565b600260009054906101000a90046001600160a01b03166001600160a01b031663f97e7d746040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac99190613384565b6001600160a01b0316336001600160a01b031614610b205760405162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a6564204163636573732160601b604482015260640161090f565b630784ce00610b2f42846133b7565b1115610b755760405162461bcd60e51b81526020600482015260156024820152744d6178206c6f636b7570206973203420796561727360581b604482015260640161090f565b6000610be97f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086604051602001610bce929190613352565b604051602081830303815290604052805190602001206123db565b60008581526009602052604090819020549051639bda2cbf60e01b8152600481018690526001600160801b03909116602482015290915081906001600160a01b03821690639bda2cbf90604401600060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050505050505050565b606060048054610c7e906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610caa906133ca565b8015610cf75780601f10610ccc57610100808354040283529160200191610cf7565b820191906000526020600020905b815481529060010190602001808311610cda57829003601f168201915b50505050509050919050565b600260015403610d255760405162461bcd60e51b815260040161090f90613404565b600260018190555460408051633e5f9f5d60e21b815290516001600160a01b039092169163f97e7d74916004808201926020929091908290030181865afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d989190613384565b6001600160a01b0316336001600160a01b031614610def5760405162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a6564204163636573732160601b604482015260640161090f565b6000610e487f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604051602001610bce929190613352565b9050600081905060006103e860065487610e62919061343b565b610e6c9190613468565b600354909150610eab906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116918791168461247b565b610eb581876133b7565b9550610eec6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685858961247b565b6000878152600960205260409081902054905163929edf4560e01b8152600481018890526001600160801b0390911660248201526001600160a01b0383169063929edf4590604401600060405180830381600087803b158015610f4e57600080fd5b505af1158015610f62573d6000803e3d6000fd5b505060018055505050505050505050565b6000546001600160a01b03163314610f9d5760405162461bcd60e51b815260040161090f9061331d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60048054610fcc906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff8906133ca565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b505050505081565b6000546001600160a01b031633146110775760405162461bcd60e51b815260040161090f9061331d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6060836000600260009054906101000a90046001600160a01b031690506000816001600160a01b031663d59e296e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190613384565b6001600160a01b0316632b04e84033856040518363ffffffff1660e01b8152600401611147929190613352565b602060405180830381865afa158015611164573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611188919061336b565b116111be5760405162461bcd60e51b815260040161090f90602080825260049082015263114c0d8d60e21b604082015260600190565b60075460ff16806111dd575060008681526008602052604090205460ff165b6112295760405162461bcd60e51b815260206004820152601960248201527f50726f787920616363657373206e6f7420656e61626c65642100000000000000604482015260640161090f565b60006112827f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089604051602001610bce929190613352565b60405163196570b760e11b815290915081906001600160a01b038216906332cae16e9034906112b7908b908b9060040161347c565b60006040518083038185885af11580156112d5573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526112fe91908101906134d0565b9450806001600160a01b0316633ff5b85f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b50505050505050509392505050565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f74206170706c696361626c6560901b604482015260640161090f565b6000546001600160a01b031633146113c15760405162461bcd60e51b815260040161090f9061331d565b600555565b6000546001600160a01b031633146113f05760405162461bcd60e51b815260040161090f9061331d565b6113fa60006124e6565b565b6000546001600160a01b031633146114265760405162461bcd60e51b815260040161090f9061331d565b600091825260086020526040909120805460ff1916911515919091179055565b600060026001540361146a5760405162461bcd60e51b815260040161090f90613404565b60026001556006546000906103e890611483908561343b565b61148d9190613468565b6003549091506114cc906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116913391168461247b565b6114d681846133b7565b9250807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f5b369813f138995818116377909787d51cbdc0c2957db33f1719a36bad521f7e60405160405180910390a360408051610120810182526000808252818301819052606082018190526080820181905260a082018190526101008201819052600160e0830181905260c0830181905230602084015283518181528085019094529192909181602001602082028036833701905050905033816000815181106115ad576115ad613518565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090506001816000815181106115ff576115ff613518565b6020026020010181815250506000600260009054906101000a90046001600160a01b03166001600160a01b031663f97e7d746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116849190613384565b6040516305a7c08f60e41b81529091506001600160a01b03821690635a7c08f0906116b9908b90879087908a906004016135a3565b6020604051808303816000875af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc919061336b565b955050505050600061175b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085604051602001610bce929190613352565b9050806117936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633838861247b565b604051635a9602ff60e11b8152600481018690526024810187905260009081906001600160a01b0384169063b52c05fe9060440160408051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118099190613641565b60008881526009602090815260409182902080546fffffffffffffffffffffffffffffffff19166001600160801b03861617905581516001600160a01b0389811682840152835180830390930183529083019283905293955091935088927f0000000000000000000000000000000000000000000000000000000000000000169133917f5bed1f834b92cc21cec09497afa47d36952b8a037e988eca6e9ecffeb497b227916118ba918d919061367b565b60405180910390a45050600180555091949350505050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316628cc26261195b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000876040516020016109cf929190613352565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c3919061336b565b905060008082116119d55760006119d8565b60015b905060608115611acc576000611a0d7f0000000000000000000000000000000000000000000000000000000000000000612536565b604051602001611a1d9190613694565b60405160208183030381529060405290506000611a5a857f00000000000000000000000000000000000000000000000000000000000000006125cc565b611a837f000000000000000000000000000000000000000000000000000000000000000061264b565b604051602001611a949291906136ba565b60405160208183030381529060405290508181604051602001611ab8929190613716565b604051602081830303815290604052925050505b6000611ad786611fb7565b90506000630784ce00611aed62093a8042613468565b611afa9062093a8061343b565b611b049190613745565b6000888152600960205260408082205490516321c984e960e01b81526001600160a01b0386811660048301526001600160801b03909216602482015292935090917f0000000000000000000000000000000000000000000000000000000000000000909116906321c984e9906044016040805180830381865afa158015611b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb39190613758565b509050828486847f000000000000000000000000000000000000000000000000000000000000000085604051602001611bf19695949392919061377c565b6040516020818303038152906040529650505050505050919050565b6000546001600160a01b03163314611c375760405162461bcd60e51b815260040161090f9061331d565b6004611c438282613818565b5050565b600260015403611c695760405162461bcd60e51b815260040161090f90613404565b6002600155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ccf5760405162461bcd60e51b815260040161090f906020808252600490820152632298189b60e11b604082015260600190565b6000611d287f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604051602001610bce929190613352565b60035460055460405163f3621e4360e01b81526001600160a01b0387811660048301529283166024820152604481019190915291925082919082169063f3621e4390606401600060405180830381600087803b158015611d8757600080fd5b505af1158015611d9b573d6000803e3d6000fd5b505050600087815260096020526040908190205490516302387a7b60e01b81526001600160801b0390911660048201526001600160a01b03831691506302387a7b90602401600060405180830381600087803b158015611dfa57600080fd5b505af1158015611e0e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d919061336b565b9050611ed36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686836126cf565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03167ff2b6e7f64080f438239b56473f2cd92b33165c88688fd898e1d99082bd0eb9548487604051602001611f4a91906001600160a01b0391909116815260200190565b60408051601f1981840301815290829052611f65929161367b565b60405180910390a45050600180555050505050565b6000546001600160a01b03163314611fa45760405162461bcd60e51b815260040161090f9061331d565b6007805460ff1916911515919091179055565b60006108df7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000846040516020016109cf929190613352565b6000546001600160a01b0316331461203a5760405162461bcd60e51b815260040161090f9061331d565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612081573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a5919061336b565b9050611c436001600160a01b03831633836126cf565b60025460408051636acf14b760e11b8152905184926001600160a01b031691600091839163d59e296e9160048083019260209291908290030181865afa158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d9190613384565b6001600160a01b0316632b04e84033856040518363ffffffff1660e01b815260040161215a929190613352565b602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b919061336b565b116121d15760405162461bcd60e51b815260040161090f90602080825260049082015263114c0d8d60e21b604082015260600190565b600061222a7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604051602001610bce929190613352565b60035460055460405163f3621e4360e01b81523360048201526001600160a01b039283166024820152604481019190915291925082919082169063f3621e4390606401600060405180830381600087803b15801561228757600080fd5b505af115801561229b573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146122d15760405162461bcd60e51b815260040161090f9061331d565b6001600160a01b0381166123365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161090f565b610944816124e6565b6000546001600160a01b031633146123695760405162461bcd60e51b815260040161090f9061331d565b600655565b60006123d4838330604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b9392505050565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b0381166108df5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161090f565b6040516001600160a01b03808516602483015283166044820152606481018290526105579085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126f3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561259757506040513d6000823e601f3d908101601f1916820160405261259491908101906134d0565b60015b6125c457505060408051808201909152600d81526c2ab735b737bbb7102a37b5b2b760991b602082015290565b90505b919050565b60606000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561262a575060408051601f3d908101601f19168201909252612627918101906138d7565b60015b61263657506012612639565b90505b61264384826127c5565b949350505050565b6060816001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa9250505080156126ac57506040513d6000823e601f3d908101601f191682016040526126a991908101906134d0565b60015b6125c45750506040805180820190915260038152623f3f3f60e81b602082015290565b6126ee8363a9059cbb60e01b84846040516024016124af929190613352565b505050565b6000612748826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661297a9092919063ffffffff16565b8051909150156126ee578080602001905181019061276691906138fa565b6126ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161090f565b606060006127d483600a6139fb565b9050836000805b821561283a5760ff8116156127fc57806127f481613a0a565b91505061281a565b612807600a84613a29565b1561281a578061281681613a0a565b9150505b8161282481613a0a565b92506128339050600a84613468565b92506127db565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260ff87166128818385613a3d565b60ff16106128b3576128938589613468565b815261289f8784613a3d565b60ff16604082018190526020820152612958565b6128bd8284613a3d565b6128c890600a6139fb565b6128d29089613468565b81528785111561292757600260808201526128ed8388613a3d565b6128f8906002613a56565b60ff1660a0820181905261290c9083613a56565b60ff16604082018190526020820152600160c0820152612958565b612932826001613a56565b60ff1660408201526129448784613a3d565b61294f906001613a56565b60ff1660608201525b604081015160ff16602082015261296e81612989565b98975050505050505050565b60606126438484600085612b85565b60606000826020015160ff166001600160401b038111156129ac576129ac612e43565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090508260c0015115612a4257600360fc1b816000815181106129fb576129fb613518565b60200101906001600160f81b031916908160001a905350601760f91b81600181518110612a2a57612a2a613518565b60200101906001600160f81b031916908160001a9053505b608083015160ff165b8360a0015160ff16811015612a9a57603060f81b828281518110612a7157612a71613518565b60200101906001600160f81b031916908160001a90535080612a9281613a6f565b915050612a4b565b505b8251156125c4576000836060015160ff16118015612ac75750826060015160ff16836040015160ff16145b15612b1057601760f91b81846040018051612ae190613a88565b60ff169081905281518110612af857612af8613518565b60200101906001600160f81b031916908160001a9053505b8251612b1e90600a90613a29565b612b29906030613745565b60f81b81846040018051612b3c90613a88565b60ff169081905281518110612b5357612b53613518565b60200101906001600160f81b031916908160001a905350600a83600001818151612b7d9190613468565b905250612a9c565b606082471015612be65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161090f565b843b612c345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161090f565b600080866001600160a01b03168587604051612c509190613aa5565b60006040518083038185875af1925050503d8060008114612c8d576040519150601f19603f3d011682016040523d82523d6000602084013e612c92565b606091505b5091509150612ca2828286612cad565b979650505050505050565b60608315612cbc5750816123d4565b825115612ccc5782518084602001fd5b8160405162461bcd60e51b815260040161090f9190612dd2565b600060208284031215612cf857600080fd5b81356001600160e01b0319811681146123d457600080fd5b600060208284031215612d2257600080fd5b5035919050565b6001600160a01b038116811461094457600080fd5b80356125c781612d29565b600080600060608486031215612d5e57600080fd5b83359250602084013591506040840135612d7781612d29565b809150509250925092565b60005b83811015612d9d578181015183820152602001612d85565b50506000910152565b60008151808452612dbe816020860160208601612d82565b601f01601f19169290920160200192915050565b6020815260006123d46020830184612da6565b60008060008060808587031215612dfb57600080fd5b8435935060208501359250604085013591506060850135612e1b81612d29565b939692955090935050565b600060208284031215612e3857600080fd5b81356123d481612d29565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b0381118282101715612e7c57612e7c612e43565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612eaa57612eaa612e43565b604052919050565b60006001600160401b03821115612ecb57612ecb612e43565b50601f01601f191660200190565b6000612eec612ee784612eb2565b612e82565b9050828152838383011115612f0057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f2857600080fd5b6123d483833560208501612ed9565b600080600060608486031215612f4c57600080fd5b833592506020840135612f5e81612d29565b915060408401356001600160401b03811115612f7957600080fd5b612f8586828701612f17565b9150509250925092565b600082601f830112612fa057600080fd5b813560206001600160401b03821115612fbb57612fbb612e43565b8160051b612fca828201612e82565b9283528481018201928281019087851115612fe457600080fd5b83870192505b84831015612ca257823582529183019190830190612fea565b801515811461094457600080fd5b80356125c781613003565b6000806000806080858703121561303257600080fd5b8435935060208501356001600160401b0381111561304f57600080fd5b61305b87828801612f8f565b935050604085013561306c81612d29565b91506060850135612e1b81613003565b6000806000806080858703121561309257600080fd5b8435935060208501356001600160401b038111156130af57600080fd5b6130bb87828801612f8f565b935050604085013591506060850135612e1b81612d29565b600080604083850312156130e657600080fd5b8235915060208301356130f881613003565b809150509250929050565b6000806040838503121561311657600080fd5b50508035926020909101359150565b60006020828403121561313757600080fd5b81356001600160401b0381111561314d57600080fd5b8201601f8101841361315e57600080fd5b61264384823560208401612ed9565b6000806000806080858703121561318357600080fd5b84359350602085013561319581612d29565b925060408501356131a581612d29565b9396929550929360600135925050565b6000602082840312156131c757600080fd5b81356123d481613003565b600080604083850312156131e557600080fd5b8235915060208301356001600160401b0381111561320257600080fd5b61320e85828601612f17565b9150509250929050565b60008060008060008587036101a081121561323257600080fd5b86359550602087013561324481612d29565b945060408701359350610120605f19820181131561326157600080fd5b613269612e59565b915061327760608901612d3e565b825261328560808901612d3e565b602083015260a0880135604083015260c0880135606083015260e088013560808301526101008089013560a08401526132bf828a01613011565b60c08401526132d16101408a01613011565b60e08401526132e36101608a01613011565b908301525091506101808601356001600160401b0381111561330457600080fd5b61331088828901612f17565b9150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561337d57600080fd5b5051919050565b60006020828403121561339657600080fd5b81516123d481612d29565b634e487b7160e01b600052601160045260246000fd5b818103818111156108df576108df6133a1565b600181811c908216806133de57607f821691505b6020821081036133fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b80820281158282048414176108df576108df6133a1565b634e487b7160e01b600052601260045260246000fd5b60008261347757613477613452565b500490565b6001600160a01b038316815260406020820181905260009061264390830184612da6565b60006134ae612ee784612eb2565b90508281528383830111156134c257600080fd5b6123d4836020830184612d82565b6000602082840312156134e257600080fd5b81516001600160401b038111156134f857600080fd5b8201601f8101841361350957600080fd5b612643848251602084016134a0565b634e487b7160e01b600052603260045260246000fd5b60018060a01b038082511683528060208301511660208401525060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151151560c083015260e081015161358f60e084018215159052565b506101008181015180151584830152610557565b848152610180602080830182905285519183018290526000916101a084019187810191845b818110156135ed5783516001600160a01b0316855293820193928201926001016135c8565b505084830360408601528651808452818801938201925060005b8181101561362357845184529382019392820192600101613607565b5050508092505050613638606083018461352e565b95945050505050565b6000806040838503121561365457600080fd5b82516001600160801b038116811461366b57600080fd5b6020939093015192949293505050565b8281526040602082015260006126436040830184612da6565b600082516136a6818460208701612d82565b6101d160f51b920191825250600201919050565b600083516136cc818460208801612d82565b61205b60f01b90830190815283516136eb816002840160208801612d82565b715d20546f6b656e7320417661696c61626c6560701b60029290910191820152601401949350505050565b60008351613728818460208801612d82565b83519083019061373c818360208801612d82565b01949350505050565b808201808211156108df576108df6133a1565b6000806040838503121561376b57600080fd5b825180600f0b811461366b57600080fd5b600060018060a01b03808916835260c0602084015261379e60c0840189612da6565b9615156040840152606083019590955250919092166080820152600f9190910b60a09091015292915050565b601f8211156126ee57600081815260208120601f850160051c810160208610156137f15750805b601f850160051c820191505b81811015613810578281556001016137fd565b505050505050565b81516001600160401b0381111561383157613831612e43565b6138458161383f84546133ca565b846137ca565b602080601f83116001811461387a57600084156138625750858301515b600019600386901b1c1916600185901b178555613810565b600085815260208120601f198616915b828110156138a95788860151825594840194600190910190840161388a565b50858210156138c75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e957600080fd5b815160ff811681146123d457600080fd5b60006020828403121561390c57600080fd5b81516123d481613003565b600181815b80851115613952578160001904821115613938576139386133a1565b8085161561394557918102915b93841c939080029061391c565b509250929050565b600082613969575060016108df565b81613976575060006108df565b816001811461398c5760028114613996576139b2565b60019150506108df565b60ff8411156139a7576139a76133a1565b50506001821b6108df565b5060208310610133831016604e8410600b84101617156139d5575081810a6108df565b6139df8383613917565b80600019048211156139f3576139f36133a1565b029392505050565b60006123d460ff84168361395a565b600060ff821660ff8103613a2057613a206133a1565b60010192915050565b600082613a3857613a38613452565b500690565b60ff82811682821603908111156108df576108df6133a1565b60ff81811683821601908111156108df576108df6133a1565b600060018201613a8157613a816133a1565b5060010190565b600060ff821680613a9b57613a9b6133a1565b6000190192915050565b60008251613ab7818460208701612d82565b919091019291505056fea2646970667358221220fe5a87f9faace4bbe8dbb6b06e090b9f4160b5a5c11a98a60d5d2acf68c803fd64736f6c634300081300336101206040523480156200001257600080fd5b506040516200157d3803806200157d83398101604081905262000035916200015f565b336080526001600160a01b03821660e081905260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000197565b6001600160a01b031660a0816001600160a01b031681525050816001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000128919062000197565b6001600160a01b0390811660c052166101005250620001bc565b80516001600160a01b03811681146200015a57600080fd5b919050565b600080604083850312156200017357600080fd5b6200017e8362000142565b91506200018e6020840162000142565b90509250929050565b600060208284031215620001aa57600080fd5b620001b58262000142565b9392505050565b60805160a05160c05160e051610100516112f06200028d600039600081816105990152818161092001526109e20152600081816101c90152818161026a015281816105320152818161068401528181610723015281816107d801526108a2015260008181610a7d01528181610b2601528181610b930152610be701526000818161074f015261080801526000818161017f0152818161034a015281816103890152818161047e015281816104d001528181610621015281816106c9015281816109a30152610c7101526112f06000f3fe6080604052600436106100705760003560e01c8063929edf451161004e578063929edf45146100d55780639bda2cbf146100f5578063b52c05fe14610115578063f3621e431461015457600080fd5b806302387a7b1461007557806332cae16e146100975780633ff5b85f146100c0575b600080fd5b34801561008157600080fd5b50610095610090366004610f65565b610174565b005b6100aa6100a5366004610fad565b61037c565b6040516100b791906110c1565b60405180910390f35b3480156100cc57600080fd5b50610095610473565b3480156100e157600080fd5b506100956100f03660046110d4565b6104c5565b34801561010157600080fd5b506100956101103660046110d4565b610616565b34801561012157600080fd5b50610135610130366004611104565b6106bb565b604080516001600160801b0390931683526020830191909152016100b7565b34801561016057600080fd5b5061009561016f366004611126565b610998565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c55760405162461bcd60e51b81526004016101bc90611167565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610249919061118e565b6040516302387a7b60e01b81526001600160801b03841660048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302387a7b90602401600060405180830381600087803b1580156102b657600080fd5b505af11580156102ca573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03841691506370a0823190602401602060405180830381865afa158015610315573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033991906111ab565b905061036f6001600160a01b0383167f000000000000000000000000000000000000000000000000000000000000000083610c1d565b610377610c6f565b505050565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103c65760405162461bcd60e51b81526004016101bc90611167565b600080846001600160a01b031634856040516103e291906111c4565b60006040518083038185875af1925050503d806000811461041f576040519150601f19603f3d011682016040523d82523d6000602084013e610424565b606091505b50915091508161046b5760405162461bcd60e51b815260206004820152601260248201527150726f78792063616c6c206661696c65642160701b60448201526064016101bc565b949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104bb5760405162461bcd60e51b81526004016101bc90611167565b6104c3610c6f565b565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461050d5760405162461bcd60e51b81526004016101bc90611167565b60405163929edf4560e01b8152600481018390526001600160801b03821660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063929edf45906044015b600060405180830381600087803b15801561057f57600080fd5b505af1158015610593573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f257600080fd5b505af1158015610606573d6000803e3d6000fd5b50505050610612610c6f565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461065e5760405162461bcd60e51b81526004016101bc90611167565b604051631c27aff360e31b81526001600160801b038084166004830152821660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e13d7f9890604401610565565b600080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107065760405162461bcd60e51b81526004016101bc90611167565b604051636eb1769f60e11b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152600019917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa158015610798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bc91906111ab565b146108775760405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015610851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087591906111e0565b505b60405163d41a464160e01b8152306004820152602481018590526001600160801b03841660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d41a46419060640160408051808303816000875af11580156108f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109169190611202565b80925081935050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561097957600080fd5b505af115801561098d573d6000803e3d6000fd5b505050509250929050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e05760405162461bcd60e51b81526004016101bc90611167565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637c2628716040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6491906111ab565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af091906111ab565b905060006103e8610b018484611246565b610b0b9190611263565b9050610b178183611285565b9150610b4d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168583610c1d565b610b846040518060400160405280601581526020017402332b29034b71031b630b4b6a932bbb0b932399d1605d1b81525082610c9b565b60405181906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016907f5b369813f138995818116377909787d51cbdc0c2957db33f1719a36bad521f7e90600090a3610c0e6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168684610c1d565b610c16610c6f565b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610377908490610ce0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316ff5b6106128282604051602401610cb1929190611298565b60408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b179052610db2565b6000610d35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610dd39092919063ffffffff16565b8051909150156103775780806020019051810190610d5391906111e0565b6103775760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101bc565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6060610de28484600085610dec565b90505b9392505050565b606082471015610e4d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101bc565b843b610e9b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bc565b600080866001600160a01b03168587604051610eb791906111c4565b60006040518083038185875af1925050503d8060008114610ef4576040519150601f19603f3d011682016040523d82523d6000602084013e610ef9565b606091505b5091509150610f09828286610f14565b979650505050505050565b60608315610f23575081610de5565b825115610f335782518084602001fd5b8160405162461bcd60e51b81526004016101bc91906110c1565b6001600160801b0381168114610f6257600080fd5b50565b600060208284031215610f7757600080fd5b8135610de581610f4d565b6001600160a01b0381168114610f6257600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610fc057600080fd5b8235610fcb81610f82565b9150602083013567ffffffffffffffff80821115610fe857600080fd5b818501915085601f830112610ffc57600080fd5b81358181111561100e5761100e610f97565b604051601f8201601f19908116603f0116810190838211818310171561103657611036610f97565b8160405282815288602084870101111561104f57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b8381101561108c578181015183820152602001611074565b50506000910152565b600081518084526110ad816020860160208601611071565b601f01601f19169290920160200192915050565b602081526000610de56020830184611095565b600080604083850312156110e757600080fd5b8235915060208301356110f981610f4d565b809150509250929050565b6000806040838503121561111757600080fd5b50508035926020909101359150565b60008060006060848603121561113b57600080fd5b833561114681610f82565b9250602084013561115681610f82565b929592945050506040919091013590565b6020808252600d908201526c556e617574686f72697a65642160981b604082015260600190565b6000602082840312156111a057600080fd5b8151610de581610f82565b6000602082840312156111bd57600080fd5b5051919050565b600082516111d6818460208701611071565b9190910192915050565b6000602082840312156111f257600080fd5b81518015158114610de557600080fd5b6000806040838503121561121557600080fd5b825161122081610f4d565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761125d5761125d611230565b92915050565b60008261128057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561125d5761125d611230565b6040815260006112ab6040830185611095565b9050826020830152939250505056fea26469706673582212203a5d66566d044a5f9e0b565311eabc41d7243f238ed2ffeb44a62c343c90b6c164736f6c6343000813003368747470733a2f2f7265766573742e6d7970696e6174612e636c6f75642f697066732f516d585964684671744b4674595739614551386370504b546d335431447633486431757a395a7559707a654e3839000000000000000000000000a68d2a210c29437a6fe5d5cb65f961858e20f3b7000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf00000000000000000000000039333a540bbea6262e405e1a6d435bd2e776561e00000000000000000000000007245e57ff68b163748c6b3044f7825fdcdd9dca
Deployed Bytecode
0x6080604052600436106102515760003560e01c80637e5af5b811610139578063aca1c665116100b6578063d25514121161007a578063d2551412146107a3578063eac8f5b8146107c3578063f2fde38b14610803578063f3ad65f414610823578063f48fe05014610843578063fe56e2321461085857600080fd5b8063aca1c66514610703578063b4927da314610723578063ba156bcb14610743578063c2cd4a0714610763578063ccec37161461078357600080fd5b80638da5cb5b116100fd5780638da5cb5b1461063d5780638ecacb1b1461065b57806399248ea71461067b5780639c26149f146106af578063a49a1e7d146106e357600080fd5b80637e5af5b81461057d57806382bfefc81461059757806389158d8e146105cb5780638bfd9174146105eb5780638d9d67051461061f57600080fd5b806327c7812c116101d2578063609d1fb311610196578063609d1fb3146104d4578063644bf7d8146104e757806370897b2314610507578063715018a61461052757806376da63f31461053c5780637d1b15dd1461055d57600080fd5b806327c7812c1461042957806338c3df07146104495780633ea5665f1461045e578063411557d11461048057806344f5c938146104b457600080fd5b80631d145721116102195780631d1457211461031d5780631f87f3331461033d5780631fd2cf06146103895780632036e7ce146103b95780632799cde0146103db57600080fd5b806301ffc9a714610256578063063c27f81461028b5780630ff4c916146102a25780631355f7ab146102d057806316f49e8a146102f0575b600080fd5b34801561026257600080fd5b50610276610271366004612ce6565b610878565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a06108e5565b005b3480156102ae57600080fd5b506102c26102bd366004612d10565b610947565b604051908152602001610282565b3480156102dc57600080fd5b506102a06102eb366004612d49565b610a52565b3480156102fc57600080fd5b5061031061030b366004612d10565b610c6f565b6040516102829190612dd2565b34801561032957600080fd5b506102a0610338366004612de5565b610d03565b34801561034957600080fd5b506103717f000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf81565b6040516001600160a01b039091168152602001610282565b34801561039557600080fd5b506102766103a4366004612d10565b60086020526000908152604090205460ff1681565b3480156103c557600080fd5b506102c26103d4366004612e26565b5060065490565b3480156103e757600080fd5b506104116103f6366004612d10565b6009602052600090815260409020546001600160801b031681565b6040516001600160801b039091168152602001610282565b34801561043557600080fd5b506102a0610444366004612e26565b610f73565b34801561045557600080fd5b50610310610fbf565b34801561046a57600080fd5b506102c2610479366004612e26565b5060055490565b34801561048c57600080fd5b506103717f000000000000000000000000a9260e283e5f9c7d15a54225d20a07181a89af1581565b3480156104c057600080fd5b506102a06104cf366004612e26565b61104d565b6103106104e2366004612f37565b611099565b3480156104f357600080fd5b506102a061050236600461301c565b61135e565b34801561051357600080fd5b506102a0610522366004612d10565b611397565b34801561053357600080fd5b506102a06113c6565b34801561054857600080fd5b506102a061055736600461307c565b50505050565b34801561056957600080fd5b506102a06105783660046130d3565b6113fc565b34801561058957600080fd5b506007546102769060ff1681565b3480156105a357600080fd5b506103717f000000000000000000000000fc0000000000000000000000000000000000000281565b3480156105d757600080fd5b506102c26105e6366004613103565b611446565b3480156105f757600080fd5b506103717f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d95681565b34801561062b57600080fd5b506002546001600160a01b0316610371565b34801561064957600080fd5b506000546001600160a01b0316610371565b34801561066757600080fd5b50610310610676366004612d10565b6118d2565b34801561068757600080fd5b506103717f000000000000000000000000fc0000000000000000000000000000000000000281565b3480156106bb57600080fd5b506103717f00000000000000000000000039333a540bbea6262e405e1a6d435bd2e776561e81565b3480156106ef57600080fd5b506102a06106fe366004613125565b611c0d565b34801561070f57600080fd5b506102a061071e36600461316d565b611c47565b34801561072f57600080fd5b506102a061073e3660046131b5565b611f7a565b34801561074f57600080fd5b5061037161075e366004612d10565b611fb7565b34801561076f57600080fd5b50600354610371906001600160a01b031681565b34801561078f57600080fd5b506102a061079e366004612e26565b612010565b3480156107af57600080fd5b506102a06107be3660046131d2565b6120bb565b3480156107cf57600080fd5b506103716107de366004612d10565b507f000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf90565b34801561080f57600080fd5b506102a061081e366004612e26565b6122a7565b34801561082f57600080fd5b50600254610371906001600160a01b031681565b6102a0610851366004613218565b5050505050565b34801561086457600080fd5b506102a0610873366004612d10565b61233f565b60006001600160e01b031982166368d1d7ad60e11b14806108a957506001600160e01b0319821663214881cd60e11b145b806108c457506001600160e01b0319821663789bc37960e01b145b806108df57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146109185760405162461bcd60e51b815260040161090f9061331d565b60405180910390fd5b60405133904780156108fc02916000818181858888f19350505050158015610944573d6000803e3d6000fd5b50565b60007f000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf6001600160a01b03166370a082316109ea7f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc00000000000000000000000000000000000002866040516020016109cf929190613352565b6040516020818303038152906040528051906020012061236e565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df919061336b565b600260009054906101000a90046001600160a01b03166001600160a01b031663f97e7d746040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac99190613384565b6001600160a01b0316336001600160a01b031614610b205760405162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a6564204163636573732160601b604482015260640161090f565b630784ce00610b2f42846133b7565b1115610b755760405162461bcd60e51b81526020600482015260156024820152744d6178206c6f636b7570206973203420796561727360581b604482015260640161090f565b6000610be97f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000286604051602001610bce929190613352565b604051602081830303815290604052805190602001206123db565b60008581526009602052604090819020549051639bda2cbf60e01b8152600481018690526001600160801b03909116602482015290915081906001600160a01b03821690639bda2cbf90604401600060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050505050505050565b606060048054610c7e906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610caa906133ca565b8015610cf75780601f10610ccc57610100808354040283529160200191610cf7565b820191906000526020600020905b815481529060010190602001808311610cda57829003601f168201915b50505050509050919050565b600260015403610d255760405162461bcd60e51b815260040161090f90613404565b600260018190555460408051633e5f9f5d60e21b815290516001600160a01b039092169163f97e7d74916004808201926020929091908290030181865afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d989190613384565b6001600160a01b0316336001600160a01b031614610def5760405162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a6564204163636573732160601b604482015260640161090f565b6000610e487f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000287604051602001610bce929190613352565b9050600081905060006103e860065487610e62919061343b565b610e6c9190613468565b600354909150610eab906001600160a01b037f000000000000000000000000fc000000000000000000000000000000000000028116918791168461247b565b610eb581876133b7565b9550610eec6001600160a01b037f000000000000000000000000fc000000000000000000000000000000000000021685858961247b565b6000878152600960205260409081902054905163929edf4560e01b8152600481018890526001600160801b0390911660248201526001600160a01b0383169063929edf4590604401600060405180830381600087803b158015610f4e57600080fd5b505af1158015610f62573d6000803e3d6000fd5b505060018055505050505050505050565b6000546001600160a01b03163314610f9d5760405162461bcd60e51b815260040161090f9061331d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60048054610fcc906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff8906133ca565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b505050505081565b6000546001600160a01b031633146110775760405162461bcd60e51b815260040161090f9061331d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6060836000600260009054906101000a90046001600160a01b031690506000816001600160a01b031663d59e296e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190613384565b6001600160a01b0316632b04e84033856040518363ffffffff1660e01b8152600401611147929190613352565b602060405180830381865afa158015611164573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611188919061336b565b116111be5760405162461bcd60e51b815260040161090f90602080825260049082015263114c0d8d60e21b604082015260600190565b60075460ff16806111dd575060008681526008602052604090205460ff165b6112295760405162461bcd60e51b815260206004820152601960248201527f50726f787920616363657373206e6f7420656e61626c65642100000000000000604482015260640161090f565b60006112827f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000289604051602001610bce929190613352565b60405163196570b760e11b815290915081906001600160a01b038216906332cae16e9034906112b7908b908b9060040161347c565b60006040518083038185885af11580156112d5573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526112fe91908101906134d0565b9450806001600160a01b0316633ff5b85f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133b57600080fd5b505af115801561134f573d6000803e3d6000fd5b50505050505050509392505050565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f74206170706c696361626c6560901b604482015260640161090f565b6000546001600160a01b031633146113c15760405162461bcd60e51b815260040161090f9061331d565b600555565b6000546001600160a01b031633146113f05760405162461bcd60e51b815260040161090f9061331d565b6113fa60006124e6565b565b6000546001600160a01b031633146114265760405162461bcd60e51b815260040161090f9061331d565b600091825260086020526040909120805460ff1916911515919091179055565b600060026001540361146a5760405162461bcd60e51b815260040161090f90613404565b60026001556006546000906103e890611483908561343b565b61148d9190613468565b6003549091506114cc906001600160a01b037f000000000000000000000000fc000000000000000000000000000000000000028116913391168461247b565b6114d681846133b7565b9250807f000000000000000000000000fc000000000000000000000000000000000000026001600160a01b03167f5b369813f138995818116377909787d51cbdc0c2957db33f1719a36bad521f7e60405160405180910390a360408051610120810182526000808252818301819052606082018190526080820181905260a082018190526101008201819052600160e0830181905260c0830181905230602084015283518181528085019094529192909181602001602082028036833701905050905033816000815181106115ad576115ad613518565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090506001816000815181106115ff576115ff613518565b6020026020010181815250506000600260009054906101000a90046001600160a01b03166001600160a01b031663f97e7d746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116849190613384565b6040516305a7c08f60e41b81529091506001600160a01b03821690635a7c08f0906116b9908b90879087908a906004016135a3565b6020604051808303816000875af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc919061336b565b955050505050600061175b7f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000285604051602001610bce929190613352565b9050806117936001600160a01b037f000000000000000000000000fc000000000000000000000000000000000000021633838861247b565b604051635a9602ff60e11b8152600481018690526024810187905260009081906001600160a01b0384169063b52c05fe9060440160408051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118099190613641565b60008881526009602090815260409182902080546fffffffffffffffffffffffffffffffff19166001600160801b03861617905581516001600160a01b0389811682840152835180830390930183529083019283905293955091935088927f000000000000000000000000fc00000000000000000000000000000000000002169133917f5bed1f834b92cc21cec09497afa47d36952b8a037e988eca6e9ecffeb497b227916118ba918d919061367b565b60405180910390a45050600180555091949350505050565b606060007f00000000000000000000000039333a540bbea6262e405e1a6d435bd2e776561e6001600160a01b0316628cc26261195b7f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc00000000000000000000000000000000000002876040516020016109cf929190613352565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c3919061336b565b905060008082116119d55760006119d8565b60015b905060608115611acc576000611a0d7f000000000000000000000000fc00000000000000000000000000000000000002612536565b604051602001611a1d9190613694565b60405160208183030381529060405290506000611a5a857f000000000000000000000000fc000000000000000000000000000000000000026125cc565b611a837f000000000000000000000000fc0000000000000000000000000000000000000261264b565b604051602001611a949291906136ba565b60405160208183030381529060405290508181604051602001611ab8929190613716565b604051602081830303815290604052925050505b6000611ad786611fb7565b90506000630784ce00611aed62093a8042613468565b611afa9062093a8061343b565b611b049190613745565b6000888152600960205260408082205490516321c984e960e01b81526001600160a01b0386811660048301526001600160801b03909216602482015292935090917f000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf909116906321c984e9906044016040805180830381865afa158015611b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb39190613758565b509050828486847f000000000000000000000000fc0000000000000000000000000000000000000285604051602001611bf19695949392919061377c565b6040516020818303038152906040529650505050505050919050565b6000546001600160a01b03163314611c375760405162461bcd60e51b815260040161090f9061331d565b6004611c438282613818565b5050565b600260015403611c695760405162461bcd60e51b815260040161090f90613404565b6002600155336001600160a01b037f000000000000000000000000a9260e283e5f9c7d15a54225d20a07181a89af151614611ccf5760405162461bcd60e51b815260040161090f906020808252600490820152632298189b60e11b604082015260600190565b6000611d287f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000287604051602001610bce929190613352565b60035460055460405163f3621e4360e01b81526001600160a01b0387811660048301529283166024820152604481019190915291925082919082169063f3621e4390606401600060405180830381600087803b158015611d8757600080fd5b505af1158015611d9b573d6000803e3d6000fd5b505050600087815260096020526040908190205490516302387a7b60e01b81526001600160801b0390911660048201526001600160a01b03831691506302387a7b90602401600060405180830381600087803b158015611dfa57600080fd5b505af1158015611e0e573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000fc000000000000000000000000000000000000026001600160a01b031691506370a0823190602401602060405180830381865afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d919061336b565b9050611ed36001600160a01b037f000000000000000000000000fc000000000000000000000000000000000000021686836126cf565b867f000000000000000000000000fc000000000000000000000000000000000000026001600160a01b0316866001600160a01b03167ff2b6e7f64080f438239b56473f2cd92b33165c88688fd898e1d99082bd0eb9548487604051602001611f4a91906001600160a01b0391909116815260200190565b60408051601f1981840301815290829052611f65929161367b565b60405180910390a45050600180555050505050565b6000546001600160a01b03163314611fa45760405162461bcd60e51b815260040161090f9061331d565b6007805460ff1916911515919091179055565b60006108df7f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc00000000000000000000000000000000000002846040516020016109cf929190613352565b6000546001600160a01b0316331461203a5760405162461bcd60e51b815260040161090f9061331d565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612081573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a5919061336b565b9050611c436001600160a01b03831633836126cf565b60025460408051636acf14b760e11b8152905184926001600160a01b031691600091839163d59e296e9160048083019260209291908290030181865afa158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d9190613384565b6001600160a01b0316632b04e84033856040518363ffffffff1660e01b815260040161215a929190613352565b602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b919061336b565b116121d15760405162461bcd60e51b815260040161090f90602080825260049082015263114c0d8d60e21b604082015260600190565b600061222a7f000000000000000000000000bd091422fd5524e3588fb03f09436b963043d9567f000000000000000000000000fc0000000000000000000000000000000000000287604051602001610bce929190613352565b60035460055460405163f3621e4360e01b81523360048201526001600160a01b039283166024820152604481019190915291925082919082169063f3621e4390606401600060405180830381600087803b15801561228757600080fd5b505af115801561229b573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146122d15760405162461bcd60e51b815260040161090f9061331d565b6001600160a01b0381166123365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161090f565b610944816124e6565b6000546001600160a01b031633146123695760405162461bcd60e51b815260040161090f9061331d565b600655565b60006123d4838330604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b9392505050565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528360601b60148201526e5af43d82803e903d91602b57fd5bf360881b6028820152826037826000f59150506001600160a01b0381166108df5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640161090f565b6040516001600160a01b03808516602483015283166044820152606481018290526105579085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526126f3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561259757506040513d6000823e601f3d908101601f1916820160405261259491908101906134d0565b60015b6125c457505060408051808201909152600d81526c2ab735b737bbb7102a37b5b2b760991b602082015290565b90505b919050565b60606000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561262a575060408051601f3d908101601f19168201909252612627918101906138d7565b60015b61263657506012612639565b90505b61264384826127c5565b949350505050565b6060816001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa9250505080156126ac57506040513d6000823e601f3d908101601f191682016040526126a991908101906134d0565b60015b6125c45750506040805180820190915260038152623f3f3f60e81b602082015290565b6126ee8363a9059cbb60e01b84846040516024016124af929190613352565b505050565b6000612748826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661297a9092919063ffffffff16565b8051909150156126ee578080602001905181019061276691906138fa565b6126ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161090f565b606060006127d483600a6139fb565b9050836000805b821561283a5760ff8116156127fc57806127f481613a0a565b91505061281a565b612807600a84613a29565b1561281a578061281681613a0a565b9150505b8161282481613a0a565b92506128339050600a84613468565b92506127db565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915260ff87166128818385613a3d565b60ff16106128b3576128938589613468565b815261289f8784613a3d565b60ff16604082018190526020820152612958565b6128bd8284613a3d565b6128c890600a6139fb565b6128d29089613468565b81528785111561292757600260808201526128ed8388613a3d565b6128f8906002613a56565b60ff1660a0820181905261290c9083613a56565b60ff16604082018190526020820152600160c0820152612958565b612932826001613a56565b60ff1660408201526129448784613a3d565b61294f906001613a56565b60ff1660608201525b604081015160ff16602082015261296e81612989565b98975050505050505050565b60606126438484600085612b85565b60606000826020015160ff166001600160401b038111156129ac576129ac612e43565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090508260c0015115612a4257600360fc1b816000815181106129fb576129fb613518565b60200101906001600160f81b031916908160001a905350601760f91b81600181518110612a2a57612a2a613518565b60200101906001600160f81b031916908160001a9053505b608083015160ff165b8360a0015160ff16811015612a9a57603060f81b828281518110612a7157612a71613518565b60200101906001600160f81b031916908160001a90535080612a9281613a6f565b915050612a4b565b505b8251156125c4576000836060015160ff16118015612ac75750826060015160ff16836040015160ff16145b15612b1057601760f91b81846040018051612ae190613a88565b60ff169081905281518110612af857612af8613518565b60200101906001600160f81b031916908160001a9053505b8251612b1e90600a90613a29565b612b29906030613745565b60f81b81846040018051612b3c90613a88565b60ff169081905281518110612b5357612b53613518565b60200101906001600160f81b031916908160001a905350600a83600001818151612b7d9190613468565b905250612a9c565b606082471015612be65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161090f565b843b612c345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161090f565b600080866001600160a01b03168587604051612c509190613aa5565b60006040518083038185875af1925050503d8060008114612c8d576040519150601f19603f3d011682016040523d82523d6000602084013e612c92565b606091505b5091509150612ca2828286612cad565b979650505050505050565b60608315612cbc5750816123d4565b825115612ccc5782518084602001fd5b8160405162461bcd60e51b815260040161090f9190612dd2565b600060208284031215612cf857600080fd5b81356001600160e01b0319811681146123d457600080fd5b600060208284031215612d2257600080fd5b5035919050565b6001600160a01b038116811461094457600080fd5b80356125c781612d29565b600080600060608486031215612d5e57600080fd5b83359250602084013591506040840135612d7781612d29565b809150509250925092565b60005b83811015612d9d578181015183820152602001612d85565b50506000910152565b60008151808452612dbe816020860160208601612d82565b601f01601f19169290920160200192915050565b6020815260006123d46020830184612da6565b60008060008060808587031215612dfb57600080fd5b8435935060208501359250604085013591506060850135612e1b81612d29565b939692955090935050565b600060208284031215612e3857600080fd5b81356123d481612d29565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b0381118282101715612e7c57612e7c612e43565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612eaa57612eaa612e43565b604052919050565b60006001600160401b03821115612ecb57612ecb612e43565b50601f01601f191660200190565b6000612eec612ee784612eb2565b612e82565b9050828152838383011115612f0057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f2857600080fd5b6123d483833560208501612ed9565b600080600060608486031215612f4c57600080fd5b833592506020840135612f5e81612d29565b915060408401356001600160401b03811115612f7957600080fd5b612f8586828701612f17565b9150509250925092565b600082601f830112612fa057600080fd5b813560206001600160401b03821115612fbb57612fbb612e43565b8160051b612fca828201612e82565b9283528481018201928281019087851115612fe457600080fd5b83870192505b84831015612ca257823582529183019190830190612fea565b801515811461094457600080fd5b80356125c781613003565b6000806000806080858703121561303257600080fd5b8435935060208501356001600160401b0381111561304f57600080fd5b61305b87828801612f8f565b935050604085013561306c81612d29565b91506060850135612e1b81613003565b6000806000806080858703121561309257600080fd5b8435935060208501356001600160401b038111156130af57600080fd5b6130bb87828801612f8f565b935050604085013591506060850135612e1b81612d29565b600080604083850312156130e657600080fd5b8235915060208301356130f881613003565b809150509250929050565b6000806040838503121561311657600080fd5b50508035926020909101359150565b60006020828403121561313757600080fd5b81356001600160401b0381111561314d57600080fd5b8201601f8101841361315e57600080fd5b61264384823560208401612ed9565b6000806000806080858703121561318357600080fd5b84359350602085013561319581612d29565b925060408501356131a581612d29565b9396929550929360600135925050565b6000602082840312156131c757600080fd5b81356123d481613003565b600080604083850312156131e557600080fd5b8235915060208301356001600160401b0381111561320257600080fd5b61320e85828601612f17565b9150509250929050565b60008060008060008587036101a081121561323257600080fd5b86359550602087013561324481612d29565b945060408701359350610120605f19820181131561326157600080fd5b613269612e59565b915061327760608901612d3e565b825261328560808901612d3e565b602083015260a0880135604083015260c0880135606083015260e088013560808301526101008089013560a08401526132bf828a01613011565b60c08401526132d16101408a01613011565b60e08401526132e36101608a01613011565b908301525091506101808601356001600160401b0381111561330457600080fd5b61331088828901612f17565b9150509295509295909350565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561337d57600080fd5b5051919050565b60006020828403121561339657600080fd5b81516123d481612d29565b634e487b7160e01b600052601160045260246000fd5b818103818111156108df576108df6133a1565b600181811c908216806133de57607f821691505b6020821081036133fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b80820281158282048414176108df576108df6133a1565b634e487b7160e01b600052601260045260246000fd5b60008261347757613477613452565b500490565b6001600160a01b038316815260406020820181905260009061264390830184612da6565b60006134ae612ee784612eb2565b90508281528383830111156134c257600080fd5b6123d4836020830184612d82565b6000602082840312156134e257600080fd5b81516001600160401b038111156134f857600080fd5b8201601f8101841361350957600080fd5b612643848251602084016134a0565b634e487b7160e01b600052603260045260246000fd5b60018060a01b038082511683528060208301511660208401525060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151151560c083015260e081015161358f60e084018215159052565b506101008181015180151584830152610557565b848152610180602080830182905285519183018290526000916101a084019187810191845b818110156135ed5783516001600160a01b0316855293820193928201926001016135c8565b505084830360408601528651808452818801938201925060005b8181101561362357845184529382019392820192600101613607565b5050508092505050613638606083018461352e565b95945050505050565b6000806040838503121561365457600080fd5b82516001600160801b038116811461366b57600080fd5b6020939093015192949293505050565b8281526040602082015260006126436040830184612da6565b600082516136a6818460208701612d82565b6101d160f51b920191825250600201919050565b600083516136cc818460208801612d82565b61205b60f01b90830190815283516136eb816002840160208801612d82565b715d20546f6b656e7320417661696c61626c6560701b60029290910191820152601401949350505050565b60008351613728818460208801612d82565b83519083019061373c818360208801612d82565b01949350505050565b808201808211156108df576108df6133a1565b6000806040838503121561376b57600080fd5b825180600f0b811461366b57600080fd5b600060018060a01b03808916835260c0602084015261379e60c0840189612da6565b9615156040840152606083019590955250919092166080820152600f9190910b60a09091015292915050565b601f8211156126ee57600081815260208120601f850160051c810160208610156137f15750805b601f850160051c820191505b81811015613810578281556001016137fd565b505050505050565b81516001600160401b0381111561383157613831612e43565b6138458161383f84546133ca565b846137ca565b602080601f83116001811461387a57600084156138625750858301515b600019600386901b1c1916600185901b178555613810565b600085815260208120601f198616915b828110156138a95788860151825594840194600190910190840161388a565b50858210156138c75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e957600080fd5b815160ff811681146123d457600080fd5b60006020828403121561390c57600080fd5b81516123d481613003565b600181815b80851115613952578160001904821115613938576139386133a1565b8085161561394557918102915b93841c939080029061391c565b509250929050565b600082613969575060016108df565b81613976575060006108df565b816001811461398c5760028114613996576139b2565b60019150506108df565b60ff8411156139a7576139a76133a1565b50506001821b6108df565b5060208310610133831016604e8410600b84101617156139d5575081810a6108df565b6139df8383613917565b80600019048211156139f3576139f36133a1565b029392505050565b60006123d460ff84168361395a565b600060ff821660ff8103613a2057613a206133a1565b60010192915050565b600082613a3857613a38613452565b500690565b60ff82811682821603908111156108df576108df6133a1565b60ff81811683821601908111156108df576108df6133a1565b600060018201613a8157613a816133a1565b5060010190565b600060ff821680613a9b57613a9b6133a1565b6000190192915050565b60008251613ab7818460208701612d82565b919091019291505056fea2646970667358221220fe5a87f9faace4bbe8dbb6b06e090b9f4160b5a5c11a98a60d5d2acf68c803fd64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a68d2a210c29437a6fe5d5cb65f961858e20f3b7000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf00000000000000000000000039333a540bbea6262e405e1a6d435bd2e776561e00000000000000000000000007245e57ff68b163748c6b3044f7825fdcdd9dca
-----Decoded View---------------
Arg [0] : _provider (address): 0xa68D2a210c29437a6fE5d5CB65f961858e20f3B7
Arg [1] : _vE (address): 0x007FD070a7E1B0fA1364044a373Ac1339bAD89CF
Arg [2] : _distributor (address): 0x39333a540bbea6262e405E1A6d435Bd2e776561E
Arg [3] : _revestAdmin (address): 0x07245E57FF68b163748C6B3044f7825FDcDd9DCA
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a68d2a210c29437a6fe5d5cb65f961858e20f3b7
Arg [1] : 000000000000000000000000007fd070a7e1b0fa1364044a373ac1339bad89cf
Arg [2] : 00000000000000000000000039333a540bbea6262e405e1a6d435bd2e776561e
Arg [3] : 00000000000000000000000007245e57ff68b163748c6b3044f7825fdcdd9dca
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.