Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 326 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Update Lock | 19727616 | 652 days ago | IN | 0 ETH | 0.00039027 | ||||
| Update Lock | 13958458 | 1490 days ago | IN | 0 ETH | 0.00516673 | ||||
| Stake Basic Toke... | 13653036 | 1538 days ago | IN | 0 ETH | 0.05599316 | ||||
| Update Lock | 13652606 | 1538 days ago | IN | 0 ETH | 0.00970116 | ||||
| Update Lock | 13652602 | 1538 days ago | IN | 0 ETH | 0.01110894 | ||||
| Update Lock | 13652529 | 1538 days ago | IN | 0 ETH | 0.01516498 | ||||
| Update Lock | 13652270 | 1538 days ago | IN | 0 ETH | 0.01289348 | ||||
| Stake Basic Toke... | 13651887 | 1538 days ago | IN | 0 ETH | 0.03135546 | ||||
| Stake Basic Toke... | 13651491 | 1538 days ago | IN | 0 ETH | 0.04235797 | ||||
| Update Lock | 13650643 | 1538 days ago | IN | 0 ETH | 0.01327866 | ||||
| Update Lock | 13650639 | 1538 days ago | IN | 0 ETH | 0.01502132 | ||||
| Update Lock | 13650633 | 1538 days ago | IN | 0 ETH | 0.01584084 | ||||
| Update Lock | 13650297 | 1538 days ago | IN | 0 ETH | 0.01864225 | ||||
| Stake Basic Toke... | 13649773 | 1538 days ago | IN | 0 ETH | 0.03701103 | ||||
| Stake Basic Toke... | 13649751 | 1538 days ago | IN | 0 ETH | 0.03969164 | ||||
| Update Lock | 13648156 | 1539 days ago | IN | 0 ETH | 0.01915487 | ||||
| Update Lock | 13648155 | 1539 days ago | IN | 0 ETH | 0.0148828 | ||||
| Update Lock | 13648148 | 1539 days ago | IN | 0 ETH | 0.01746263 | ||||
| Update Lock | 13647322 | 1539 days ago | IN | 0 ETH | 0.01930133 | ||||
| Update Lock | 13646707 | 1539 days ago | IN | 0 ETH | 0.01436078 | ||||
| Stake Basic Toke... | 13646399 | 1539 days ago | IN | 0 ETH | 0.07061906 | ||||
| Stake Basic Toke... | 13644332 | 1539 days ago | IN | 0 ETH | 0.04790769 | ||||
| Stake Basic Toke... | 13644302 | 1539 days ago | IN | 0 ETH | 0.05086313 | ||||
| Stake Basic Toke... | 13644224 | 1539 days ago | IN | 0 ETH | 0.05705089 | ||||
| Update Lock | 13642065 | 1540 days ago | IN | 0 ETH | 0.02328216 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GNU-GPL v3.0 or later
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/IOutputReceiver.sol";
import "../interfaces/IRevest.sol";
import "../interfaces/IAddressRegistry.sol";
import "../interfaces/IRewardsHandler.sol";
import "../interfaces/IFNFTHandler.sol";
import "../interfaces/IAddressLock.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';
contract Staking is Ownable, IOutputReceiver, ERC165, IAddressLock {
using SafeERC20 for IERC20;
address private revestAddress;
address public lpAddress;
address public rewardsHandlerAddress;
address public addressRegistry;
uint private constant ONE_DAY = 86400;
uint private constant WINDOW_ONE = ONE_DAY;
uint private constant WINDOW_THREE = ONE_DAY*5;
uint private constant WINDOW_SIX = ONE_DAY*9;
uint private constant WINDOW_TWELVE = ONE_DAY*14;
address internal immutable WETH;
uint[4] internal interestRates = [4, 13, 27, 56];
string public customMetadataUrl = "https://revest.mypinata.cloud/ipfs/QmeSaVihizntuDQL5BgsujK2nK6bkkwXXzHATGGjM2uyRr";
string public addressMetadataUrl = "https://revest.mypinata.cloud/ipfs/QmY3KUBToJBthPLvN1Knd7Y51Zxx7FenFhXYV8tPEMVAP3";
event StakedRevest(uint indexed timePeriod, bool indexed isBasic, uint indexed amount, uint fnftId);
struct StakingConfig {
uint allocPoints;
uint timePeriod;
}
// fnftId -> allocPoints
mapping(uint => StakingConfig) public config;
constructor(
address revestAddress_,
address rewardsHandlerAddress_,
address addressRegistry_,
address wrappedEth_
) {
revestAddress = revestAddress_;
addressRegistry = addressRegistry_;
rewardsHandlerAddress = rewardsHandlerAddress_;
WETH = wrappedEth_;
}
function supportsInterface(bytes4 interfaceId) public view override (ERC165, IERC165) returns (bool) {
return (
interfaceId == type(IOutputReceiver).interfaceId
|| interfaceId == type(IAddressLock).interfaceId
|| super.supportsInterface(interfaceId)
);
}
function stakeBasicTokens(uint amount, uint monthsMaturity) public returns (uint) {
require(monthsMaturity == 1 || monthsMaturity == 3 || monthsMaturity == 6 || monthsMaturity == 12, 'E055');
IERC20(revestAddress).safeTransferFrom(msg.sender, address(this), amount * 1);
IERC20(revestAddress).approve(address(getRevest()), amount * 1);
IRevest.FNFTConfig memory fnftConfig;
fnftConfig.asset = revestAddress;
fnftConfig.depositAmount = amount;
fnftConfig.pipeToContract = address(this);
address[] memory recipients = new address[](1);
recipients[0] = _msgSender();
uint[] memory quantities = new uint[](1);
// FNFT quantity will always be singular
quantities[0] = 1;
uint fnftId = getRevest().mintAddressLock(address(this), '', recipients, quantities, fnftConfig);
uint interestRate = getInterestRate(monthsMaturity);
uint allocPoint = amount * interestRate;
uint currentShares = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, revestAddress, true);
uint newAllocPoint = currentShares + allocPoint;
StakingConfig memory stakeConfig = StakingConfig(allocPoint, monthsMaturity);
config[fnftId] = stakeConfig;
IRewardsHandler(rewardsHandlerAddress).updateBasicShares(fnftId, newAllocPoint);
emit StakedRevest(monthsMaturity, true, amount, fnftId);
return fnftId;
}
function stakeLPTokens(uint amount, uint monthsMaturity) public returns (uint) {
require(lpAddress != address(0x0), "E071");
require(monthsMaturity == 1 || monthsMaturity == 3 || monthsMaturity == 6 || monthsMaturity == 12, 'E055');
IERC20(lpAddress).safeTransferFrom(msg.sender, address(this), amount * 1);
IERC20(lpAddress).approve(address(getRevest()), amount * 1);
IRevest.FNFTConfig memory fnftConfig;
fnftConfig.asset = lpAddress;
fnftConfig.depositAmount = amount;
fnftConfig.pipeToContract = address(this);
address[] memory recipients = new address[](1);
recipients[0] = _msgSender();
uint[] memory quantities = new uint[](1);
quantities[0] = 1;
uint fnftId = getRevest().mintAddressLock(address(this), '', recipients, quantities, fnftConfig);
uint interestRate = getInterestRate(monthsMaturity);
uint allocPoint = amount * interestRate;
uint currentShares = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, revestAddress, true);
uint newAllocPoint = currentShares + allocPoint;
StakingConfig memory stakeConfig = StakingConfig(allocPoint, monthsMaturity);
config[fnftId] = stakeConfig;
IRewardsHandler(rewardsHandlerAddress).updateLPShares(fnftId, newAllocPoint);
emit StakedRevest(monthsMaturity, false, amount, fnftId);
return fnftId;
}
function getInterestRate(uint months) public view returns (uint) {
if (months <= 1) {
return interestRates[0];
} else if (months <= 3) {
return interestRates[1];
} else if (months <= 6) {
return interestRates[2];
} else {
return interestRates[3];
}
}
function updateInterestRates(uint[4] memory newRates) external onlyOwner {
interestRates = newRates;
}
function receiveRevestOutput(
uint fnftId,
address asset,
address payable owner,
uint quantity
) external override {
require(_msgSender() == getRegistry().getTokenVault(), "E016");
uint totalQuantity = quantity * ITokenVault(getRegistry().getTokenVault()).getFNFT(fnftId).depositAmount;
if (asset == revestAddress) {
unstakeBasicTokens(fnftId, owner);
} else if (asset == lpAddress) {
unstakeLPTokens(fnftId, owner);
} else {
require(false, "E072");
}
IERC20(asset).safeTransfer(owner, totalQuantity);
}
function claimRewards(uint fnftId) external {
// Check to make sure user owns the fnftId
require(IFNFTHandler(getRegistry().getRevestFNFT()).getBalance(_msgSender(), fnftId) == 1, 'E061');
// Receive rewards
IRewardsHandler(rewardsHandlerAddress).claimRewards(fnftId, _msgSender());
}
function unstakeBasicTokens(uint fnftId, address user) internal {
// Receive rewards
IRewardsHandler(rewardsHandlerAddress).claimRewards(fnftId, user);
// Remove allocation points
uint allocPoint = config[fnftId].allocPoints;
uint currentShares = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, revestAddress, true);
uint newAllocPoint = currentShares - allocPoint;
IRewardsHandler(rewardsHandlerAddress).updateBasicShares(fnftId, newAllocPoint);
}
function unstakeLPTokens(uint fnftId, address user) internal {
IRewardsHandler(rewardsHandlerAddress).claimRewards(fnftId, user);
// Remove allocation points
uint allocPoint = config[fnftId].allocPoints;
uint currentShares = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, lpAddress, true);
uint newAllocPoint = currentShares - allocPoint;
IRewardsHandler(rewardsHandlerAddress).updateLPShares(fnftId, newAllocPoint);
}
function updateLock(uint fnftId, uint lockId, bytes memory arguments) external override {
require(IFNFTHandler(getRegistry().getRevestFNFT()).getBalance(_msgSender(), fnftId) == 1, 'E061');
// Receive rewards
IRewardsHandler(rewardsHandlerAddress).claimRewards(fnftId, _msgSender());
}
function needsUpdate() external pure override returns (bool) {
return true;
}
function setCustomMetadata(string memory _customMetadataUrl) external onlyOwner {
customMetadataUrl = _customMetadataUrl;
}
function getCustomMetadata(uint fnftId) external view override returns (string memory) {
return customMetadataUrl;
}
function getOutputDisplayValues(uint fnftId) external view override returns (bytes memory) {
bool isRevestToken;
{
// Will be zero if this is an LP stake
uint revestTokenAlloc = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, revestAddress, true);
uint wethTokenAlloc = IRewardsHandler(rewardsHandlerAddress).getAllocPoint(fnftId, WETH, true);
isRevestToken = revestTokenAlloc > 0 || wethTokenAlloc > 0;
}
uint revestRewards = IRewardsHandler(rewardsHandlerAddress).getRewards(fnftId, revestAddress);
uint wethRewards = IRewardsHandler(rewardsHandlerAddress).getRewards(fnftId, WETH);
return abi.encode(revestRewards, wethRewards, config[fnftId].timePeriod, isRevestToken ? revestAddress : lpAddress);
}
function setLPAddress(address lpAddress_) external onlyOwner {
lpAddress = lpAddress_;
}
function setAddressRegistry(address addressRegistry_) external override onlyOwner {
addressRegistry = addressRegistry_;
}
function getAddressRegistry() external view override returns (address) {
return addressRegistry;
}
function getRevest() private view returns (IRevest) {
return IRevest(getRegistry().getRevest());
}
function getRegistry() public view returns (IAddressRegistry) {
return IAddressRegistry(addressRegistry);
}
function getValue(uint fnftId) external view override returns (uint) {
uint revestStake = IRewardsHandler(rewardsHandlerAddress).getRewards(fnftId, revestAddress);
return revestStake > 0 ? revestStake : IRewardsHandler(rewardsHandlerAddress).getRewards(fnftId, WETH);
}
function getAsset(uint fnftId) external view override returns (address) {
uint revestStake = IRewardsHandler(rewardsHandlerAddress).getRewards(fnftId, revestAddress);
return revestStake > 0 ? revestAddress : WETH;
}
function setMetadata(string memory _addressMetadataUrl) external onlyOwner {
addressMetadataUrl = _addressMetadataUrl;
}
function setRewardsHandler(address _handler) external onlyOwner {
rewardsHandlerAddress = _handler;
}
function getMetadata() external view override returns (string memory) {
return addressMetadataUrl;
}
function getDisplayValues(uint fnftId, uint lockId) external view override returns (bytes memory) {
StakingConfig memory lockDetails = config[fnftId];
return abi.encode(lockDetails.allocPoints, lockDetails.timePeriod);
}
function createLock(uint fnftId, uint lockID, bytes memory arguments) external pure override {
return;
}
function isUnlockable(uint fnftId, uint lockId) external view override returns (bool) {
uint window = getWindow(config[fnftId].timePeriod);
uint depositTime = ILockManager(getRegistry().getLockManager()).fnftIdToLock(fnftId).creationTime;
bool mature = block.timestamp - depositTime > window;
bool window_open = (block.timestamp - depositTime) % (config[fnftId].timePeriod * 30 * ONE_DAY) < window;
return mature && window_open;
}
function getWindow(uint timePeriod) private pure returns (uint) {
if(timePeriod == 1) {
return WINDOW_ONE;
}
if(timePeriod == 3) {
return WINDOW_THREE;
}
if(timePeriod == 6) {
return WINDOW_SIX;
}
if(timePeriod == 12) {
return WINDOW_TWELVE;
}
// If none of these are true, bad call
require(false, "Invalid time window");
}
// Admin functions
function manualMapConfig(
uint[] memory fnftIds,
uint[] memory allocPoints,
uint[] memory timePeriod
) external onlyOwner {
for(uint i = 0; i < fnftIds.length; i++) {
config[fnftIds[i]].allocPoints = allocPoints[i];
config[fnftIds[i]].timePeriod = timePeriod[i];
}
}
}// 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: 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);
}// 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 primaryAsset,
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 setFlatWeiFee(uint wethFee) external;
function setERC20Fee(uint erc20) external;
function getFlatWeiFee() external returns (uint);
function getERC20Fee() external returns (uint);
}// 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;
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;
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 "./IRegistryProvider.sol";
import '@openzeppelin/contracts/utils/introspection/IERC165.sol';
/**
* @title Provider interface for Revest FNFTs
* @dev Address locks MUST be non-upgradeable to be considered for trusted status
* @author Revest
*/
interface IAddressLock is IRegistryProvider, IERC165{
/// Creates a lock to the specified lockID
/// @param fnftId the fnftId to map this lock to. Not recommended for typical locks, as it will break on splitting
/// @param lockId the lockId to map this lock to. Recommended uint for storing references to lock configurations
/// @param arguments an abi.encode() bytes array. Allows frontend to encode and pass in an arbitrary set of parameters
/// @dev creates a lock for the specified lockId. Will be called during the creation process for address locks when the address
/// of a contract implementing this interface is passed in as the "trigger" address for minting an address lock. The bytes
/// representing any parameters this lock requires are passed through to this method, where abi.decode must be call on them
function createLock(uint fnftId, uint lockId, bytes memory arguments) external;
/// Updates a lock at the specified lockId
/// @param fnftId the fnftId that can map to a lock config stored in implementing contracts. Not recommended, as it will break on splitting
/// @param lockId the lockId that maps to the lock config which should be updated. Recommended for retrieving references to lock configurations
/// @param arguments an abi.encode() bytes array. Allows frontend to encode and pass in an arbitrary set of parameters
/// @dev updates a lock for the specified lockId. Will be called by the frontend from the information section if an update is requested
/// can further accept and decode parameters to use in modifying the lock's config or triggering other actions
/// such as triggering an on-chain oracle to update
function updateLock(uint fnftId, uint lockId, bytes memory arguments) external;
/// Whether or not the lock can be unlocked
/// @param fnftId the fnftId that can map to a lock config stored in implementing contracts. Not recommended, as it will break on splitting
/// @param lockId the lockId that maps to the lock config which should be updated. Recommended for retrieving references to lock configurations
/// @dev this method is called during the unlocking and withdrawal processes by the Revest contract - it is also used by the frontend
/// if this method is returning true and someone attempts to unlock or withdraw from an FNFT attached to the requested lock, the request will succeed
/// @return whether or not this lock may be unlocked
function isUnlockable(uint fnftId, uint lockId) external view returns (bool);
/// Provides an encoded bytes arary that represents values this lock wants to display on the info screen
/// Info to decode these values is provided in the metadata file
/// @param fnftId the fnftId that can map to a lock config stored in implementing contracts. Not recommended, as it will break on splitting
/// @param lockId the lockId that maps to the lock config which should be updated. Recommended for retrieving references to lock configurations
/// @dev used by the frontend to fetch on-chain data on the state of any given lock
/// @return a bytes array that represents the result of calling abi.encode on values which the developer wants to appear on the frontend
function getDisplayValues(uint fnftId, uint lockId) external view returns (bytes memory);
/// Maps to a URL, typically IPFS-based, that contains information on how to encode and decode paramters sent to and from this lock
/// Please see additional documentation for JSON config info
/// @dev this method will be called by the frontend only but is crucial to properly implement for proper minting and information workflows
/// @return a URL to the JSON file containing this lock's metadata schema
function getMetadata() external view returns (string memory);
/// Whether or not this lock will need updates and should display the option for them
/// @dev this will be called by the frontend to determine if update inputs and buttons should be displayed
/// @return whether or not the locks created by this contract will need updates
function needsUpdate() external view returns (bool);
}// 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;
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 "./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;
/*
* @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 "../interfaces/IAddressRegistry.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/ILockManager.sol";
import "../interfaces/ITokenVault.sol";
import "../lib/uniswap/IUniswapV2Factory.sol";
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;
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;
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: UNLICENSED
pragma solidity ^0.8.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}// 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);
}
}
}
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"revestAddress_","type":"address"},{"internalType":"address","name":"rewardsHandlerAddress_","type":"address"},{"internalType":"address","name":"addressRegistry_","type":"address"},{"internalType":"address","name":"wrappedEth_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"timePeriod","type":"uint256"},{"indexed":true,"internalType":"bool","name":"isBasic","type":"bool"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"StakedRevest","type":"event"},{"inputs":[],"name":"addressMetadataUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"config","outputs":[{"internalType":"uint256","name":"allocPoints","type":"uint256"},{"internalType":"uint256","name":"timePeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"bytes","name":"arguments","type":"bytes"}],"name":"createLock","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"customMetadataUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAddressRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getCustomMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"getDisplayValues","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"months","type":"uint256"}],"name":"getInterestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getOutputDisplayValues","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"contract IAddressRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"}],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"lockId","type":"uint256"}],"name":"isUnlockable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"fnftIds","type":"uint256[]"},{"internalType":"uint256[]","name":"allocPoints","type":"uint256[]"},{"internalType":"uint256[]","name":"timePeriod","type":"uint256[]"}],"name":"manualMapConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"needsUpdate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"receiveRevestOutput","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsHandlerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressRegistry_","type":"address"}],"name":"setAddressRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_customMetadataUrl","type":"string"}],"name":"setCustomMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress_","type":"address"}],"name":"setLPAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_addressMetadataUrl","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_handler","type":"address"}],"name":"setRewardsHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"monthsMaturity","type":"uint256"}],"name":"stakeBasicTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"monthsMaturity","type":"uint256"}],"name":"stakeLPTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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[4]","name":"newRates","type":"uint256[4]"}],"name":"updateInterestRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fnftId","type":"uint256"},{"internalType":"uint256","name":"lockId","type":"uint256"},{"internalType":"bytes","name":"arguments","type":"bytes"}],"name":"updateLock","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
610120604052600460a0818152600d60c052601b60e0526038610100526200002b91600591906200016f565b5060405180608001604052806051815260200162003d2a6051913980516200005c91600991602090910190620001b7565b5060405180608001604052806051815260200162003cd96051913980516200008d91600a91602090910190620001b7565b503480156200009b57600080fd5b5060405162003d7b38038062003d7b833981016040819052620000be9162000268565b620000c9336200011f565b600180546001600160a01b03199081166001600160a01b039687161790915560048054821693861693909317909255600380549092169290931691909117905560601b6001600160601b03191660805262000301565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8260048101928215620001a5579160200282015b82811115620001a5578251829060ff1690559160200191906001019062000183565b50620001b392915062000234565b5090565b828054620001c590620002c4565b90600052602060002090601f016020900481019282620001e95760008555620001a5565b82601f106200020457805160ff1916838001178555620001a5565b82800160010185558215620001a5579182015b82811115620001a557825182559160200191906001019062000217565b5b80821115620001b3576000815560010162000235565b80516001600160a01b03811681146200026357600080fd5b919050565b600080600080608085870312156200027e578384fd5b62000289856200024b565b935062000299602086016200024b565b9250620002a9604086016200024b565b9150620002b9606086016200024b565b905092959194509250565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c6139a46200033560003960008181610c04015281816118df01528181611a6001526124e101526139a46000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637a351a1d1161012a5780639b4dc8cc116100bd578063b38221ff1161008c578063ec03679b11610071578063ec03679b146104df578063f2fde38b146104f2578063f3ad65f41461050557600080fd5b8063b38221ff146104b9578063eac8f5b8146104cc57600080fd5b80639b4dc8cc1461046d578063a24bc8f914610480578063a49a1e7d14610493578063aca1c665146104a657600080fd5b80638d9d6705116100f95780638d9d67051461033d5780638da5cb5b146104365780638e2affe6146104475780638ecacb1b1461045a57600080fd5b80637a351a1d146103855780637a5b4f59146103985780637e3c2ad8146103a057806384691767146103fa57600080fd5b80631c847816116101bd578063346c94091161018c57806365973040116101715780636597304014610362578063715018a61461036a578063798e54ac1461037257600080fd5b8063346c9409146103365780635ab1bd531461033d57600080fd5b80631c847816146102ea578063270a091e146102fd57806327c7812c146103105780632add8d1b1461032357600080fd5b80630c196a74116101f95780630c196a74146102905780630ff4c916146102b157806316f49e8a146102c4578063175cec23146102d757600080fd5b806301ffc9a71461022b578063045c2255146102535780630787508e146102685780630962ef791461027d575b600080fd5b61023e6102393660046132d8565b610518565b60405190151581526020015b60405180910390f35b61026661026136600461352a565b6105fd565b005b610270610828565b60405161024a9190613711565b61026661028b366004613492565b6108b6565b6102a361029e366004613492565b610ad6565b60405190815260200161024a565b6102a36102bf366004613492565b610b1d565b6102706102d2366004613492565b610c95565b61023e6102e5366004613509565b610d29565b6102666102f836600461352a565b505050565b6102a361030b366004613509565b610ec0565b61026661031e366004613180565b6113ab565b610266610331366004613318565b61143f565b600161023e565b6004546001600160a01b03165b6040516001600160a01b03909116815260200161024a565b6102706114ac565b6102666114b9565b60035461034a906001600160a01b031681565b610266610393366004613180565b61151f565b6102706115b3565b6102706103ae366004613509565b506000908152600b602090815260409182902082518084018452815480825260019092015490830181905283519283019190915281830152815180820383018152606090910190915290565b610421610408366004613492565b600b602052600090815260409020805460019091015482565b6040805192835260208301919091520161024a565b6000546001600160a01b031661034a565b61026661045536600461323a565b611645565b610270610468366004613492565b6117f4565b60025461034a906001600160a01b031681565b6102a361048e366004613509565b611b66565b6102666104a1366004613318565b612096565b6102666104b43660046134c2565b612103565b6102666104c7366004613180565b61239e565b61034a6104da366004613492565b612432565b6102666104ed3660046131b8565b612518565b610266610500366004613180565b61257f565b60045461034a906001600160a01b031681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd1a3af5a0000000000000000000000000000000000000000000000000000000014806105ab57507fffffffff0000000000000000000000000000000000000000000000000000000082167f3f8f47e800000000000000000000000000000000000000000000000000000000145b806105f757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6004546001600160a01b03166001600160a01b031663d59e296e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561064157600080fd5b505afa158015610655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610679919061319c565b6001600160a01b0316632b04e840336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024810186905260440160206040518083038186803b1580156106e657600080fd5b505afa1580156106fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071e91906134aa565b6001146107785760405162461bcd60e51b815260040161076f9060208082526004908201527f4530363100000000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390fd5b6003546001600160a01b0316636c7b69cb84336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082291906134aa565b50505050565b600a805461083590613835565b80601f016020809104026020016040519081016040528092919081815260200182805461086190613835565b80156108ae5780601f10610883576101008083540402835291602001916108ae565b820191906000526020600020905b81548152906001019060200180831161089157829003601f168201915b505050505081565b6004546001600160a01b03166001600160a01b031663d59e296e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fa57600080fd5b505afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610932919061319c565b6001600160a01b0316632b04e840336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024810184905260440160206040518083038186803b15801561099f57600080fd5b505afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d791906134aa565b600114610a285760405162461bcd60e51b815260040161076f9060208082526004908201527f4530363100000000000000000000000000000000000000000000000000000000604082015260600190565b6003546001600160a01b0316636c7b69cb82336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad291906134aa565b5050565b600060018211610aed57600560005b015492915050565b60038211610afe5760056001610ae5565b60068211610b0f5760056002610ae5565b60056003610ae5565b919050565b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039182166024820152600092839216906329d21a009060440160206040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc091906134aa565b905060008111610c8c576003546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152909116906329d21a009060440160206040518083038186803b158015610c4f57600080fd5b505afa158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8791906134aa565b610c8e565b805b9392505050565b606060098054610ca490613835565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd090613835565b8015610d1d5780601f10610cf257610100808354040283529160200191610d1d565b820191906000526020600020905b815481529060010190602001808311610d0057829003601f168201915b50505050509050919050565b6000828152600b60205260408120600101548190610d4690612661565b90506000610d5c6004546001600160a01b031690565b6001600160a01b031663035d0c696040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc919061319c565b6001600160a01b0316633fe8ca06866040518263ffffffff1660e01b8152600401610df991815260200190565b6101406040518083038186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a91906133f7565b608001519050600082610e5d83426137f2565b11905060008362015180600b60008a815260200190815260200160002060010154601e610e8a91906137b5565b610e9491906137b5565b610e9e85426137f2565b610ea891906138c2565b109050818015610eb55750805b979650505050505050565b60008160011480610ed15750816003145b80610edc5750816006145b80610ee7575081600c145b610f355760405162461bcd60e51b815260040161076f9060208082526004908201527f4530353500000000000000000000000000000000000000000000000000000000604082015260600190565b610f593330610f458660016137b5565b6001546001600160a01b0316929190612703565b6001546001600160a01b031663095ea7b3610f726127d2565b610f7d8660016137b5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610fdb57600080fd5b505af1158015610fef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101391906132be565b5060408051610120810182526000606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052600180546001600160a01b0316835282840187905230602084015283518181528085019094529192909181602001602082028036833701905050905033816000815181106110c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260009181602001602082028036833701905050905060018160008151811061113c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060006111526127d2565b6001600160a01b03166302e236bc308585886040518563ffffffff1660e01b8152600401611183949392919061365d565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d591906134aa565b905060006111e287610ad6565b905060006111f0828a6137b5565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b03918216602482015260448101929092529293506000929091169063352152ff9060640160206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906134aa565b905060006112ad838361379d565b60408051808201825285815260208082018e815260008a8152600b9092529083902082518155905160019091015560035491517f7af3a86f0000000000000000000000000000000000000000000000000000000081526004810189905260248101849052929350916001600160a01b0390911690637af3a86f90604401600060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050508b600115158c7f293550fb329a6232032e6a883f1173a8c25a2639cf0209858586df3d000c9fb58960405161139391815260200190565b60405180910390a450939a9950505050505050505050565b6000546001600160a01b031633146114055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b8051610ad2906009906020840190612f15565b6009805461083590613835565b6000546001600160a01b031633146115135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b61151d600061285b565b565b6000546001600160a01b031633146115795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600a80546115c290613835565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613835565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b6000546001600160a01b0316331461169f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60005b8351811015610822578281815181106116e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600b6000868481518110611729577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000018190555081818151811061177f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600b60008684815181106117c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206001018190555080806117ec90613889565b9150506116a2565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039182166024820152604481019290925260609260009283929091169063352152ff9060640160206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a591906134aa565b6003546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152600160448301529293506000929091169063352152ff9060640160206040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f91906134aa565b905060008211806119805750600081115b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b039182166024820152929550600094501691506329d21a009060440160206040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2691906134aa565b6003546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152929350600092909116906329d21a009060440160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae991906134aa565b6000868152600b60205260409020600101549091508290829085611b18576002546001600160a01b0316611b25565b6001546001600160a01b03165b60408051602081019590955284019290925260608301526001600160a01b0316608082015260a0016040516020818303038152906040529350505050919050565b6002546000906001600160a01b0316611bc35760405162461bcd60e51b815260040161076f9060208082526004908201527f4530373100000000000000000000000000000000000000000000000000000000604082015260600190565b8160011480611bd25750816003145b80611bdd5750816006145b80611be8575081600c145b611c365760405162461bcd60e51b815260040161076f9060208082526004908201527f4530353500000000000000000000000000000000000000000000000000000000604082015260600190565b611c5a3330611c468660016137b5565b6002546001600160a01b0316929190612703565b6002546001600160a01b031663095ea7b3611c736127d2565b611c7e8660016137b5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611cdc57600080fd5b505af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906132be565b5060408051610120810182526000606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526002546001600160a01b031682528183018690523060208301528251600180825281850190945291929091908160200160208202803683370190505090503381600081518110611dc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020016020820280368337019050509050600181600081518110611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506000611e556127d2565b6001600160a01b03166302e236bc308585886040518563ffffffff1660e01b8152600401611e86949392919061365d565b602060405180830381600087803b158015611ea057600080fd5b505af1158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed891906134aa565b90506000611ee587610ad6565b90506000611ef3828a6137b5565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b03918216602482015260448101929092529293506000929091169063352152ff9060640160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa291906134aa565b90506000611fb0838361379d565b60408051808201825285815260208082018e815260008a8152600b9092529083902082518155905160019091015560035491517f611203280000000000000000000000000000000000000000000000000000000081526004810189905260248101849052929350916001600160a01b0390911690636112032890604401600060405180830381600087803b15801561204757600080fd5b505af115801561205b573d6000803e3d6000fd5b505050508b600015158c7f293550fb329a6232032e6a883f1173a8c25a2639cf0209858586df3d000c9fb58960405161139391815260200190565b6000546001600160a01b031633146120f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b8051610ad290600a906020840190612f15565b6004546001600160a01b03166001600160a01b03166354f2f7af6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214757600080fd5b505afa15801561215b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217f919061319c565b6001600160a01b0316336001600160a01b0316146121e15760405162461bcd60e51b815260040161076f9060208082526004908201527f4530313600000000000000000000000000000000000000000000000000000000604082015260600190565b60006121f56004546001600160a01b031690565b6001600160a01b03166354f2f7af6040518163ffffffff1660e01b815260040160206040518083038186803b15801561222d57600080fd5b505afa158015612241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612265919061319c565b6001600160a01b031663522f9b37866040518263ffffffff1660e01b815260040161229291815260200190565b6101206040518083038186803b1580156122ab57600080fd5b505afa1580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e3919061335e565b604001516122f190836137b5565b6001549091506001600160a01b03858116911614156123195761231485846128c3565b612383565b6002546001600160a01b0385811691161415612339576123148584612ab1565b60405162461bcd60e51b815260040161076f9060208082526004908201527f4530373200000000000000000000000000000000000000000000000000000000604082015260600190565b6123976001600160a01b0385168483612c68565b5050505050565b6000546001600160a01b031633146123f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039182166024820152600092839216906329d21a009060440160206040518083038186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d591906134aa565b905060008111612505577f0000000000000000000000000000000000000000000000000000000000000000610c8e565b6001546001600160a01b03169392505050565b6000546001600160a01b031633146125725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b610ad26005826004612f99565b6000546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b6001600160a01b0381166126555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161076f565b61265e8161285b565b50565b60008160011415612676575062015180919050565b816003141561268d576105f76201518060056137b5565b81600614156126a4576105f76201518060096137b5565b81600c14156126bb576105f762015180600e6137b5565b60405162461bcd60e51b815260206004820152601360248201527f496e76616c69642074696d652077696e646f7700000000000000000000000000604482015260640161076f565b6040516001600160a01b03808516602483015283166044820152606481018290526108229085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612cb1565b60006127e66004546001600160a01b031690565b6001600160a01b031663f97e7d746040518163ffffffff1660e01b815260040160206040518083038186803b15801561281e57600080fd5b505afa158015612832573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612856919061319c565b905090565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6003546040517f6c7b69cb000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690636c7b69cb90604401602060405180830381600087803b15801561292a57600080fd5b505af115801561293e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296291906134aa565b506000828152600b6020526040808220546003546001805493517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0394851660248201526044810191909152919392169063352152ff9060640160206040518083038186803b1580156129e457600080fd5b505afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c91906134aa565b90506000612a2a83836137f2565b6003546040517f7af3a86f00000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192506001600160a01b031690637af3a86f906044015b600060405180830381600087803b158015612a9257600080fd5b505af1158015612aa6573d6000803e3d6000fd5b505050505050505050565b6003546040517f6c7b69cb000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690636c7b69cb90604401602060405180830381600087803b158015612b1857600080fd5b505af1158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5091906134aa565b506000828152600b60205260408082205460035460025492517f352152ff000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03938416602482015260016044820152919392169063352152ff9060640160206040518083038186803b158015612bd057600080fd5b505afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906134aa565b90506000612c1683836137f2565b6003546040517f6112032800000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192506001600160a01b031690636112032890604401612a78565b6040516001600160a01b0383166024820152604481018290526102f89084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612750565b6000612d06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d969092919063ffffffff16565b8051909150156102f85780806020019051810190612d2491906132be565b6102f85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161076f565b6060612da58484600085612dad565b949350505050565b606082471015612e255760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161076f565b843b612e735760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b03168587604051612e8f9190613641565b60006040518083038185875af1925050503d8060008114612ecc576040519150601f19603f3d011682016040523d82523d6000602084013e612ed1565b606091505b5091509150610eb582828660608315612eeb575081610c8e565b825115612efb5782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613711565b828054612f2190613835565b90600052602060002090601f016020900481019282612f435760008555612f89565b82601f10612f5c57805160ff1916838001178555612f89565b82800160010185558215612f89579182015b82811115612f89578251825591602001919060010190612f6e565b50612f95929150612fc6565b5090565b8260048101928215612f895791602002820182811115612f89578251825591602001919060010190612f6e565b5b80821115612f955760008155600101612fc7565b600067ffffffffffffffff831115612ff557612ff561392a565b61302660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161374e565b905082815283838301111561303a57600080fd5b828260208301376000602084830101529392505050565b8051610b1881613959565b600082601f83011261306c578081fd5b8135602067ffffffffffffffff8211156130885761308861392a565b8160051b61309782820161374e565b8381528281019086840183880185018910156130b1578687fd5b8693505b858410156130d35780358352600193909301929184019184016130b5565b50979650505050505050565b80518015158114610b1857600080fd5b600060a08284031215613100578081fd5b60405160a0810181811067ffffffffffffffff821117156131235761312361392a565b8060405250809150825161313681613959565b8152602083015161314681613959565b6020820152604083015161315981613959565b604082015260608381015190820152613174608084016130df565b60808201525092915050565b600060208284031215613191578081fd5b8135610c8e81613959565b6000602082840312156131ad578081fd5b8151610c8e81613959565b6000608082840312156131c9578081fd5b82601f8301126131d7578081fd5b6040516080810181811067ffffffffffffffff821117156131fa576131fa61392a565b60405280836080810186101561320e578384fd5b835b600481101561322f578135835260209283019290910190600101613210565b509195945050505050565b60008060006060848603121561324e578182fd5b833567ffffffffffffffff80821115613265578384fd5b6132718783880161305c565b94506020860135915080821115613286578384fd5b6132928783880161305c565b935060408601359150808211156132a7578283fd5b506132b48682870161305c565b9150509250925092565b6000602082840312156132cf578081fd5b610c8e826130df565b6000602082840312156132e9578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c8e578182fd5b600060208284031215613329578081fd5b813567ffffffffffffffff81111561333f578182fd5b8201601f8101841361334f578182fd5b612da584823560208401612fdb565b60006101208284031215613370578081fd5b613378613724565b61338183613051565b815261338f60208401613051565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201526133c860c084016130df565b60c08201526133d960e084016130df565b60e08201526101006133ec8185016130df565b908201529392505050565b60006101408284031215613409578081fd5b60405160c0810181811067ffffffffffffffff8211171561342c5761342c61392a565b604052825161343a81613959565b815260208301516004811061344d578283fd5b602082015261345f84604085016130ef565b604082015260e08301516060820152610100830151608082015261348661012084016130df565b60a08201529392505050565b6000602082840312156134a3578081fd5b5035919050565b6000602082840312156134bb578081fd5b5051919050565b600080600080608085870312156134d7578182fd5b8435935060208501356134e981613959565b925060408501356134f981613959565b9396929550929360600135925050565b6000806040838503121561351b578182fd5b50508035926020909101359150565b60008060006060848603121561353e578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613562578182fd5b8401601f81018613613572578182fd5b6132b486823560208401612fdb565b60008151808452613599816020860160208601613809565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038082511683528060208301511660208401525060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151151560c083015260e081015161362d60e084018215159052565b506101008181015180151584830152610822565b60008251613653818460208701613809565b9190910192915050565b60006101a06001600160a01b0380881684526020828186015283838601526101c0925082850183604087015280935088518082526101e087019450828a019150855b818110156136bd57825185168652948301949183019160010161369f565b505050848303606086015286518084528188019382019250845b818110156136f3578451845293820193928201926001016136d7565b505050809250505061370860808301846135cb565b95945050505050565b602081526000610c8e6020830184613581565b604051610120810167ffffffffffffffff811182821017156137485761374861392a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137955761379561392a565b604052919050565b600082198211156137b0576137b06138fb565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ed576137ed6138fb565b500290565b600082821015613804576138046138fb565b500390565b60005b8381101561382457818101518382015260200161380c565b838111156108225750506000910152565b600181811c9082168061384957607f821691505b60208210811415613883577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138bb576138bb6138fb565b5060010190565b6000826138f6577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461265e57600080fdfea26469706673582212209df7d153fcb27bd44e6c4bf85dc4d3d5784afd769e5d99442db1cf960a1ce5c464736f6c6343000804003368747470733a2f2f7265766573742e6d7970696e6174612e636c6f75642f697066732f516d59334b5542546f4a427468504c764e314b6e64375935315a78783746656e4668585956387450454d5641503368747470733a2f2f7265766573742e6d7970696e6174612e636c6f75642f697066732f516d655361566968697a6e747544514c35426773756a4b326e4b36626b6b7758587a48415447476a4d3275795272000000000000000000000000120a3879da835a5af037bb2d1456bebd6b54d4ba000000000000000000000000a4e7f2a1edb5ad886baa09fb258f8aca7c934ba6000000000000000000000000d721a90dd7e010c8c5e022cc0100c55ac78e0fc4000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102265760003560e01c80637a351a1d1161012a5780639b4dc8cc116100bd578063b38221ff1161008c578063ec03679b11610071578063ec03679b146104df578063f2fde38b146104f2578063f3ad65f41461050557600080fd5b8063b38221ff146104b9578063eac8f5b8146104cc57600080fd5b80639b4dc8cc1461046d578063a24bc8f914610480578063a49a1e7d14610493578063aca1c665146104a657600080fd5b80638d9d6705116100f95780638d9d67051461033d5780638da5cb5b146104365780638e2affe6146104475780638ecacb1b1461045a57600080fd5b80637a351a1d146103855780637a5b4f59146103985780637e3c2ad8146103a057806384691767146103fa57600080fd5b80631c847816116101bd578063346c94091161018c57806365973040116101715780636597304014610362578063715018a61461036a578063798e54ac1461037257600080fd5b8063346c9409146103365780635ab1bd531461033d57600080fd5b80631c847816146102ea578063270a091e146102fd57806327c7812c146103105780632add8d1b1461032357600080fd5b80630c196a74116101f95780630c196a74146102905780630ff4c916146102b157806316f49e8a146102c4578063175cec23146102d757600080fd5b806301ffc9a71461022b578063045c2255146102535780630787508e146102685780630962ef791461027d575b600080fd5b61023e6102393660046132d8565b610518565b60405190151581526020015b60405180910390f35b61026661026136600461352a565b6105fd565b005b610270610828565b60405161024a9190613711565b61026661028b366004613492565b6108b6565b6102a361029e366004613492565b610ad6565b60405190815260200161024a565b6102a36102bf366004613492565b610b1d565b6102706102d2366004613492565b610c95565b61023e6102e5366004613509565b610d29565b6102666102f836600461352a565b505050565b6102a361030b366004613509565b610ec0565b61026661031e366004613180565b6113ab565b610266610331366004613318565b61143f565b600161023e565b6004546001600160a01b03165b6040516001600160a01b03909116815260200161024a565b6102706114ac565b6102666114b9565b60035461034a906001600160a01b031681565b610266610393366004613180565b61151f565b6102706115b3565b6102706103ae366004613509565b506000908152600b602090815260409182902082518084018452815480825260019092015490830181905283519283019190915281830152815180820383018152606090910190915290565b610421610408366004613492565b600b602052600090815260409020805460019091015482565b6040805192835260208301919091520161024a565b6000546001600160a01b031661034a565b61026661045536600461323a565b611645565b610270610468366004613492565b6117f4565b60025461034a906001600160a01b031681565b6102a361048e366004613509565b611b66565b6102666104a1366004613318565b612096565b6102666104b43660046134c2565b612103565b6102666104c7366004613180565b61239e565b61034a6104da366004613492565b612432565b6102666104ed3660046131b8565b612518565b610266610500366004613180565b61257f565b60045461034a906001600160a01b031681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd1a3af5a0000000000000000000000000000000000000000000000000000000014806105ab57507fffffffff0000000000000000000000000000000000000000000000000000000082167f3f8f47e800000000000000000000000000000000000000000000000000000000145b806105f757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6004546001600160a01b03166001600160a01b031663d59e296e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561064157600080fd5b505afa158015610655573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610679919061319c565b6001600160a01b0316632b04e840336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024810186905260440160206040518083038186803b1580156106e657600080fd5b505afa1580156106fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071e91906134aa565b6001146107785760405162461bcd60e51b815260040161076f9060208082526004908201527f4530363100000000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390fd5b6003546001600160a01b0316636c7b69cb84336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381600087803b1580156107ea57600080fd5b505af11580156107fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082291906134aa565b50505050565b600a805461083590613835565b80601f016020809104026020016040519081016040528092919081815260200182805461086190613835565b80156108ae5780601f10610883576101008083540402835291602001916108ae565b820191906000526020600020905b81548152906001019060200180831161089157829003601f168201915b505050505081565b6004546001600160a01b03166001600160a01b031663d59e296e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fa57600080fd5b505afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610932919061319c565b6001600160a01b0316632b04e840336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024810184905260440160206040518083038186803b15801561099f57600080fd5b505afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d791906134aa565b600114610a285760405162461bcd60e51b815260040161076f9060208082526004908201527f4530363100000000000000000000000000000000000000000000000000000000604082015260600190565b6003546001600160a01b0316636c7b69cb82336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381600087803b158015610a9a57600080fd5b505af1158015610aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad291906134aa565b5050565b600060018211610aed57600560005b015492915050565b60038211610afe5760056001610ae5565b60068211610b0f5760056002610ae5565b60056003610ae5565b919050565b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039182166024820152600092839216906329d21a009060440160206040518083038186803b158015610b8857600080fd5b505afa158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc091906134aa565b905060008111610c8c576003546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281166024830152909116906329d21a009060440160206040518083038186803b158015610c4f57600080fd5b505afa158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8791906134aa565b610c8e565b805b9392505050565b606060098054610ca490613835565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd090613835565b8015610d1d5780601f10610cf257610100808354040283529160200191610d1d565b820191906000526020600020905b815481529060010190602001808311610d0057829003601f168201915b50505050509050919050565b6000828152600b60205260408120600101548190610d4690612661565b90506000610d5c6004546001600160a01b031690565b6001600160a01b031663035d0c696040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc919061319c565b6001600160a01b0316633fe8ca06866040518263ffffffff1660e01b8152600401610df991815260200190565b6101406040518083038186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a91906133f7565b608001519050600082610e5d83426137f2565b11905060008362015180600b60008a815260200190815260200160002060010154601e610e8a91906137b5565b610e9491906137b5565b610e9e85426137f2565b610ea891906138c2565b109050818015610eb55750805b979650505050505050565b60008160011480610ed15750816003145b80610edc5750816006145b80610ee7575081600c145b610f355760405162461bcd60e51b815260040161076f9060208082526004908201527f4530353500000000000000000000000000000000000000000000000000000000604082015260600190565b610f593330610f458660016137b5565b6001546001600160a01b0316929190612703565b6001546001600160a01b031663095ea7b3610f726127d2565b610f7d8660016137b5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610fdb57600080fd5b505af1158015610fef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101391906132be565b5060408051610120810182526000606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052600180546001600160a01b0316835282840187905230602084015283518181528085019094529192909181602001602082028036833701905050905033816000815181106110c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260009181602001602082028036833701905050905060018160008151811061113c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060006111526127d2565b6001600160a01b03166302e236bc308585886040518563ffffffff1660e01b8152600401611183949392919061365d565b602060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d591906134aa565b905060006111e287610ad6565b905060006111f0828a6137b5565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b03918216602482015260448101929092529293506000929091169063352152ff9060640160206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906134aa565b905060006112ad838361379d565b60408051808201825285815260208082018e815260008a8152600b9092529083902082518155905160019091015560035491517f7af3a86f0000000000000000000000000000000000000000000000000000000081526004810189905260248101849052929350916001600160a01b0390911690637af3a86f90604401600060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050508b600115158c7f293550fb329a6232032e6a883f1173a8c25a2639cf0209858586df3d000c9fb58960405161139391815260200190565b60405180910390a450939a9950505050505050505050565b6000546001600160a01b031633146114055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114995760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b8051610ad2906009906020840190612f15565b6009805461083590613835565b6000546001600160a01b031633146115135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b61151d600061285b565b565b6000546001600160a01b031633146115795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600a80546115c290613835565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613835565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b6000546001600160a01b0316331461169f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60005b8351811015610822578281815181106116e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600b6000868481518110611729577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206000018190555081818151811061177f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600b60008684815181106117c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000206001018190555080806117ec90613889565b9150506116a2565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039182166024820152604481019290925260609260009283929091169063352152ff9060640160206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a591906134aa565b6003546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281166024830152600160448301529293506000929091169063352152ff9060640160206040518083038186803b15801561193757600080fd5b505afa15801561194b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196f91906134aa565b905060008211806119805750600081115b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b039182166024820152929550600094501691506329d21a009060440160206040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2691906134aa565b6003546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281166024830152929350600092909116906329d21a009060440160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae991906134aa565b6000868152600b60205260409020600101549091508290829085611b18576002546001600160a01b0316611b25565b6001546001600160a01b03165b60408051602081019590955284019290925260608301526001600160a01b0316608082015260a0016040516020818303038152906040529350505050919050565b6002546000906001600160a01b0316611bc35760405162461bcd60e51b815260040161076f9060208082526004908201527f4530373100000000000000000000000000000000000000000000000000000000604082015260600190565b8160011480611bd25750816003145b80611bdd5750816006145b80611be8575081600c145b611c365760405162461bcd60e51b815260040161076f9060208082526004908201527f4530353500000000000000000000000000000000000000000000000000000000604082015260600190565b611c5a3330611c468660016137b5565b6002546001600160a01b0316929190612703565b6002546001600160a01b031663095ea7b3611c736127d2565b611c7e8660016137b5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611cdc57600080fd5b505af1158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906132be565b5060408051610120810182526000606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526002546001600160a01b031682528183018690523060208301528251600180825281850190945291929091908160200160208202803683370190505090503381600081518110611dc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020016020820280368337019050509050600181600081518110611e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506000611e556127d2565b6001600160a01b03166302e236bc308585886040518563ffffffff1660e01b8152600401611e86949392919061365d565b602060405180830381600087803b158015611ea057600080fd5b505af1158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed891906134aa565b90506000611ee587610ad6565b90506000611ef3828a6137b5565b600354600180546040517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b03918216602482015260448101929092529293506000929091169063352152ff9060640160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa291906134aa565b90506000611fb0838361379d565b60408051808201825285815260208082018e815260008a8152600b9092529083902082518155905160019091015560035491517f611203280000000000000000000000000000000000000000000000000000000081526004810189905260248101849052929350916001600160a01b0390911690636112032890604401600060405180830381600087803b15801561204757600080fd5b505af115801561205b573d6000803e3d6000fd5b505050508b600015158c7f293550fb329a6232032e6a883f1173a8c25a2639cf0209858586df3d000c9fb58960405161139391815260200190565b6000546001600160a01b031633146120f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b8051610ad290600a906020840190612f15565b6004546001600160a01b03166001600160a01b03166354f2f7af6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214757600080fd5b505afa15801561215b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217f919061319c565b6001600160a01b0316336001600160a01b0316146121e15760405162461bcd60e51b815260040161076f9060208082526004908201527f4530313600000000000000000000000000000000000000000000000000000000604082015260600190565b60006121f56004546001600160a01b031690565b6001600160a01b03166354f2f7af6040518163ffffffff1660e01b815260040160206040518083038186803b15801561222d57600080fd5b505afa158015612241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612265919061319c565b6001600160a01b031663522f9b37866040518263ffffffff1660e01b815260040161229291815260200190565b6101206040518083038186803b1580156122ab57600080fd5b505afa1580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e3919061335e565b604001516122f190836137b5565b6001549091506001600160a01b03858116911614156123195761231485846128c3565b612383565b6002546001600160a01b0385811691161415612339576123148584612ab1565b60405162461bcd60e51b815260040161076f9060208082526004908201527f4530373200000000000000000000000000000000000000000000000000000000604082015260600190565b6123976001600160a01b0385168483612c68565b5050505050565b6000546001600160a01b031633146123f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6003546001546040517f29d21a00000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039182166024820152600092839216906329d21a009060440160206040518083038186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d591906134aa565b905060008111612505577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610c8e565b6001546001600160a01b03169392505050565b6000546001600160a01b031633146125725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b610ad26005826004612f99565b6000546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b6001600160a01b0381166126555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161076f565b61265e8161285b565b50565b60008160011415612676575062015180919050565b816003141561268d576105f76201518060056137b5565b81600614156126a4576105f76201518060096137b5565b81600c14156126bb576105f762015180600e6137b5565b60405162461bcd60e51b815260206004820152601360248201527f496e76616c69642074696d652077696e646f7700000000000000000000000000604482015260640161076f565b6040516001600160a01b03808516602483015283166044820152606481018290526108229085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612cb1565b60006127e66004546001600160a01b031690565b6001600160a01b031663f97e7d746040518163ffffffff1660e01b815260040160206040518083038186803b15801561281e57600080fd5b505afa158015612832573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612856919061319c565b905090565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6003546040517f6c7b69cb000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690636c7b69cb90604401602060405180830381600087803b15801561292a57600080fd5b505af115801561293e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296291906134aa565b506000828152600b6020526040808220546003546001805493517f352152ff000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b0394851660248201526044810191909152919392169063352152ff9060640160206040518083038186803b1580156129e457600080fd5b505afa1580156129f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1c91906134aa565b90506000612a2a83836137f2565b6003546040517f7af3a86f00000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192506001600160a01b031690637af3a86f906044015b600060405180830381600087803b158015612a9257600080fd5b505af1158015612aa6573d6000803e3d6000fd5b505050505050505050565b6003546040517f6c7b69cb000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03838116602483015290911690636c7b69cb90604401602060405180830381600087803b158015612b1857600080fd5b505af1158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5091906134aa565b506000828152600b60205260408082205460035460025492517f352152ff000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03938416602482015260016044820152919392169063352152ff9060640160206040518083038186803b158015612bd057600080fd5b505afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906134aa565b90506000612c1683836137f2565b6003546040517f6112032800000000000000000000000000000000000000000000000000000000815260048101889052602481018390529192506001600160a01b031690636112032890604401612a78565b6040516001600160a01b0383166024820152604481018290526102f89084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612750565b6000612d06826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d969092919063ffffffff16565b8051909150156102f85780806020019051810190612d2491906132be565b6102f85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161076f565b6060612da58484600085612dad565b949350505050565b606082471015612e255760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161076f565b843b612e735760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076f565b600080866001600160a01b03168587604051612e8f9190613641565b60006040518083038185875af1925050503d8060008114612ecc576040519150601f19603f3d011682016040523d82523d6000602084013e612ed1565b606091505b5091509150610eb582828660608315612eeb575081610c8e565b825115612efb5782518084602001fd5b8160405162461bcd60e51b815260040161076f9190613711565b828054612f2190613835565b90600052602060002090601f016020900481019282612f435760008555612f89565b82601f10612f5c57805160ff1916838001178555612f89565b82800160010185558215612f89579182015b82811115612f89578251825591602001919060010190612f6e565b50612f95929150612fc6565b5090565b8260048101928215612f895791602002820182811115612f89578251825591602001919060010190612f6e565b5b80821115612f955760008155600101612fc7565b600067ffffffffffffffff831115612ff557612ff561392a565b61302660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161374e565b905082815283838301111561303a57600080fd5b828260208301376000602084830101529392505050565b8051610b1881613959565b600082601f83011261306c578081fd5b8135602067ffffffffffffffff8211156130885761308861392a565b8160051b61309782820161374e565b8381528281019086840183880185018910156130b1578687fd5b8693505b858410156130d35780358352600193909301929184019184016130b5565b50979650505050505050565b80518015158114610b1857600080fd5b600060a08284031215613100578081fd5b60405160a0810181811067ffffffffffffffff821117156131235761312361392a565b8060405250809150825161313681613959565b8152602083015161314681613959565b6020820152604083015161315981613959565b604082015260608381015190820152613174608084016130df565b60808201525092915050565b600060208284031215613191578081fd5b8135610c8e81613959565b6000602082840312156131ad578081fd5b8151610c8e81613959565b6000608082840312156131c9578081fd5b82601f8301126131d7578081fd5b6040516080810181811067ffffffffffffffff821117156131fa576131fa61392a565b60405280836080810186101561320e578384fd5b835b600481101561322f578135835260209283019290910190600101613210565b509195945050505050565b60008060006060848603121561324e578182fd5b833567ffffffffffffffff80821115613265578384fd5b6132718783880161305c565b94506020860135915080821115613286578384fd5b6132928783880161305c565b935060408601359150808211156132a7578283fd5b506132b48682870161305c565b9150509250925092565b6000602082840312156132cf578081fd5b610c8e826130df565b6000602082840312156132e9578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c8e578182fd5b600060208284031215613329578081fd5b813567ffffffffffffffff81111561333f578182fd5b8201601f8101841361334f578182fd5b612da584823560208401612fdb565b60006101208284031215613370578081fd5b613378613724565b61338183613051565b815261338f60208401613051565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201526133c860c084016130df565b60c08201526133d960e084016130df565b60e08201526101006133ec8185016130df565b908201529392505050565b60006101408284031215613409578081fd5b60405160c0810181811067ffffffffffffffff8211171561342c5761342c61392a565b604052825161343a81613959565b815260208301516004811061344d578283fd5b602082015261345f84604085016130ef565b604082015260e08301516060820152610100830151608082015261348661012084016130df565b60a08201529392505050565b6000602082840312156134a3578081fd5b5035919050565b6000602082840312156134bb578081fd5b5051919050565b600080600080608085870312156134d7578182fd5b8435935060208501356134e981613959565b925060408501356134f981613959565b9396929550929360600135925050565b6000806040838503121561351b578182fd5b50508035926020909101359150565b60008060006060848603121561353e578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613562578182fd5b8401601f81018613613572578182fd5b6132b486823560208401612fdb565b60008151808452613599816020860160208601613809565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038082511683528060208301511660208401525060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151151560c083015260e081015161362d60e084018215159052565b506101008181015180151584830152610822565b60008251613653818460208701613809565b9190910192915050565b60006101a06001600160a01b0380881684526020828186015283838601526101c0925082850183604087015280935088518082526101e087019450828a019150855b818110156136bd57825185168652948301949183019160010161369f565b505050848303606086015286518084528188019382019250845b818110156136f3578451845293820193928201926001016136d7565b505050809250505061370860808301846135cb565b95945050505050565b602081526000610c8e6020830184613581565b604051610120810167ffffffffffffffff811182821017156137485761374861392a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137955761379561392a565b604052919050565b600082198211156137b0576137b06138fb565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137ed576137ed6138fb565b500290565b600082821015613804576138046138fb565b500390565b60005b8381101561382457818101518382015260200161380c565b838111156108225750506000910152565b600181811c9082168061384957607f821691505b60208210811415613883577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138bb576138bb6138fb565b5060010190565b6000826138f6577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461265e57600080fdfea26469706673582212209df7d153fcb27bd44e6c4bf85dc4d3d5784afd769e5d99442db1cf960a1ce5c464736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000120a3879da835a5af037bb2d1456bebd6b54d4ba000000000000000000000000a4e7f2a1edb5ad886baa09fb258f8aca7c934ba6000000000000000000000000d721a90dd7e010c8c5e022cc0100c55ac78e0fc4000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : revestAddress_ (address): 0x120a3879da835A5aF037bB2d1456beBd6B54d4bA
Arg [1] : rewardsHandlerAddress_ (address): 0xA4E7f2a1EDB5AD886baA09Fb258F8ACA7c934ba6
Arg [2] : addressRegistry_ (address): 0xD721A90dd7e010c8C5E022cc0100c55aC78E0FC4
Arg [3] : wrappedEth_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000120a3879da835a5af037bb2d1456bebd6b54d4ba
Arg [1] : 000000000000000000000000a4e7f2a1edb5ad886baa09fb258f8aca7c934ba6
Arg [2] : 000000000000000000000000d721a90dd7e010c8c5e022cc0100c55ac78e0fc4
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.