Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 28 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem | 29554049 | 39 days ago | IN | 0 FRAX | 0.00000332 | ||||
| Deposit | 15399840 | 366 days ago | IN | 0 FRAX | 0.00000042 | ||||
| Withdraw | 14710211 | 382 days ago | IN | 0 FRAX | 0.00000083 | ||||
| Deposit | 13998349 | 399 days ago | IN | 0 FRAX | 0.00000104 | ||||
| Deposit | 13062747 | 420 days ago | IN | 0 FRAX | 0.00000106 | ||||
| Withdraw | 11082791 | 466 days ago | IN | 0 FRAX | 0.0000016 | ||||
| Withdraw | 10785843 | 473 days ago | IN | 0 FRAX | 0.00000159 | ||||
| Withdraw | 10622972 | 477 days ago | IN | 0 FRAX | 0.00000289 | ||||
| Deposit | 10618273 | 477 days ago | IN | 0 FRAX | 0.0000013 | ||||
| Deposit | 10365210 | 483 days ago | IN | 0 FRAX | 0.00000094 | ||||
| Deposit | 9745622 | 497 days ago | IN | 0 FRAX | 0.0000002 | ||||
| Deposit | 9452847 | 504 days ago | IN | 0 FRAX | 0.0000002 | ||||
| Set Operator | 9105853 | 512 days ago | IN | 0 FRAX | 0.00000014 | ||||
| Withdraw | 8763514 | 520 days ago | IN | 0 FRAX | 0.00000032 | ||||
| Deposit | 8760349 | 520 days ago | IN | 0 FRAX | 0.00000022 | ||||
| Set Operator | 8696873 | 521 days ago | IN | 0 FRAX | 0.00000007 | ||||
| Update Balances | 8695470 | 521 days ago | IN | 0 FRAX | 0.00000007 | ||||
| Set Operator | 8695408 | 521 days ago | IN | 0 FRAX | 0.00000009 | ||||
| Update Balances | 8693974 | 522 days ago | IN | 0 FRAX | 0.00000006 | ||||
| Update Balances | 8635145 | 523 days ago | IN | 0 FRAX | 0.00000031 | ||||
| Set Bounds | 8025735 | 537 days ago | IN | 0 FRAX | 0.00000367 | ||||
| Deposit | 8008057 | 537 days ago | IN | 0 FRAX | 0.00000955 | ||||
| Deposit | 8007078 | 537 days ago | IN | 0 FRAX | 0.00002379 | ||||
| Set Operator | 8006894 | 537 days ago | IN | 0 FRAX | 0.00003467 | ||||
| Set Fees | 8006888 | 537 days ago | IN | 0 FRAX | 0.00003601 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
cvxFXB
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import "../interfaces/IERC4626.sol";
import "../interfaces/IFraxLend.sol";
import "../interfaces/IRewardReceiver.sol";
import "../interfaces/IDualOracle.sol";
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
interface IMigrator{
function migrate() external;
function fraxlend() external view returns(address);
}
interface ICvxFXBOperator{
function calcUtilBounds() external view returns(uint256 useUtil);
}
/*
cvxFXB
a fxb token wrapper that borrows against the fxb for sfrax in the background
- compound fxb token with profits
- minimalized trust (mostly immutable except for sfrax interest processing)
- withdraw underlying at any time (assuming fraxlend repayment isnt paused)
- open calls for anyone to balance
*/
contract cvxFXB is ERC20, ReentrancyGuard, IERC4626{
using SafeERC20 for IERC20;
address public stakingToken;
address public fraxlend;
address public immutable frax;
address public immutable sfrax;
address public immutable sfraxVault;
uint256 public constant EXCHANGE_PRECISION = 1e18;
uint256 public constant LTV_PRECISION = 100000;
address public operator;
uint256 public operatorTime;
address public owner;
address public pendingOwner;
address public migratorRole;
address public pendingMigratorRole;
address public migrationContract;
uint256 public migrationTime;
bool public isPaused;
uint256 public borrowBound;
uint256 public repayBound;
uint256 public utilBound;
address public swapper;
address public feeCollector;
uint256 public fee;
uint256 public swapbuffer;
//events
event SetPendingOwner(address indexed _address);
event SetPendingMigrationRole(address indexed _address);
event SetMigrationContract(address indexed _address);
event SetOperator(address indexed _address);
event SetSwapper(address indexed _address);
event SetSwapBuffer(uint256 _buffer);
event SetFees(address indexed _address, uint256 _fees);
event SetBounds(uint256 _borrow, uint256 _repay, uint256 _util);
event SetPaused(bool _paused);
event OwnerChanged(address indexed _address);
event MigrationRoleChanged(address indexed _address);
event Deposit(
address indexed sender,
address indexed owner,
uint256 assets,
uint256 shares
);
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 share
);
constructor(address _fxb, address _lend, address _frax, address _sfrax, address _sfraxVault, address _migratorRole) ERC20(
"Wrapped FXB",
"wFXB"
){
stakingToken = _fxb;
fraxlend = _lend;
frax = _frax;
sfrax = _sfrax;
sfraxVault = _sfraxVault;
owner = msg.sender;
emit OwnerChanged(msg.sender);
operator = msg.sender;
emit SetOperator(msg.sender);
migratorRole = _migratorRole;
emit MigrationRoleChanged(_migratorRole);
borrowBound = 97000;
repayBound = 99000;
utilBound = 95000;
emit SetBounds(borrowBound, repayBound, utilBound);
IERC20(frax).approve(sfraxVault, type(uint256).max);
IERC20(sfrax).approve(sfraxVault, type(uint256).max);
IERC20(frax).approve(fraxlend, type(uint256).max);
IERC20(stakingToken).approve(fraxlend, type(uint256).max);
//mint unbacked shares to this address
//deployment should send the outstanding amount
_mint(address(this), 1e18);
}
modifier onlyOwner() {
require(owner == msg.sender, "!o_auth");
_;
}
modifier onlyMigratorRole() {
require(migratorRole == msg.sender, "!m_auth");
_;
}
modifier onlyOperator() {
require(owner == msg.sender || operator == msg.sender, "!op_auth");
_;
}
//set pending owner
function setPendingOwner(address _po) external onlyOwner{
pendingOwner = _po;
emit SetPendingOwner(_po);
}
//claim ownership
function acceptPendingOwner() external {
require(pendingOwner != address(0) && msg.sender == pendingOwner, "!p_owner");
owner = pendingOwner;
pendingOwner = address(0);
emit OwnerChanged(owner);
}
//set pending migration role
function setPendingMigrationRole(address _pmr) external onlyMigratorRole{
pendingMigratorRole = _pmr;
emit SetPendingMigrationRole(_pmr);
}
//claim migration role
function acceptPendingMigrationRole() external {
require(pendingMigratorRole != address(0) && msg.sender == pendingMigratorRole, "!p_migrationRole");
migratorRole = pendingMigratorRole;
pendingMigratorRole = address(0);
emit MigrationRoleChanged(migratorRole);
}
function setMigrationContract(address _migrateContract) external onlyMigratorRole{
migrationContract = _migrateContract;
migrationTime = block.timestamp + 1 weeks; //set timelock of migration
emit SetMigrationContract(_migrateContract);
}
function migrate() external onlyMigratorRole{
require(migrationContract != address(0),"!mcontract");
require(block.timestamp >= migrationTime, "!mtime");
//repay
_repayShares(IFraxLend(fraxlend).userBorrowShares(address(this)));
//withdraw collateral
IFraxLend(fraxlend).removeCollateral(IFraxLend(fraxlend).userCollateralBalance(address(this)), address(this));
//send underlying to migrator
IERC20(stakingToken).safeTransfer(migrationContract, IERC20(stakingToken).balanceOf(address(this)));
//update token and fraxlend
fraxlend = IMigrator(migrationContract).fraxlend();
stakingToken = IFraxLend(fraxlend).collateralContract();
//tell migrator to execute
IMigrator(migrationContract).migrate();
//approve new fraxlend
IERC20(stakingToken).approve(fraxlend, type(uint256).max);
IERC20(frax).approve(fraxlend, type(uint256).max);
//reset migrator settings
migrationContract = address(0);
emit SetMigrationContract(address(0));
//reset swapper
swapper = address(0);
emit SetSwapper(address(0));
//set to pause so that owner can adjust settings after migration
isPaused = true;
emit SetPaused(true);
//reset operator as it could be a contract thats configured for previous parameters
operator = address(0);
//force a small window where an operator cant be set
operatorTime = block.timestamp + 1 weeks;
emit SetOperator(address(0));
}
//set operator
function setOperator(address _o) external onlyOwner{
require(block.timestamp >= operatorTime, "!otime");
operator = _o;
emit SetOperator(_o);
}
function setPaused(bool _pause) external onlyOwner{
if(_pause){
//repay
_repayShares(IFraxLend(fraxlend).userBorrowShares(address(this)));
}
isPaused = _pause;
emit SetPaused(_pause);
}
function setSwapper(address _swap) external onlyOwner{
swapper = _swap;
emit SetSwapper(_swap);
}
function setSwapBuffer(uint256 _buffer) external onlyOperator{
swapbuffer = _buffer;
emit SetSwapBuffer(_buffer);
}
function setFees(address _feeCollector, uint256 _fee) external onlyOwner{
require(_fee <= 50000, "invalid fee");
feeCollector = _feeCollector;
fee = _fee;
emit SetFees(_feeCollector, _fee);
}
//set boundaries
function setBounds(uint256 _borrowb, uint256 _repayb, uint256 _utilb) external onlyOwner{
require(_repayb >= _borrowb+1000 && _repayb <= 99000,"repay gap");
require(_utilb < LTV_PRECISION, "util gap");
borrowBound = _borrowb;
repayBound = _repayb;
utilBound = _utilb;
emit SetBounds(_borrowb, _repayb, _utilb);
}
//let operator change utilization bounds
function setUtilBounds(uint256 _utilb) external onlyOperator{
require(_utilb < LTV_PRECISION, "util gap");
_setUtilBounds(_utilb);
}
function _setUtilBounds(uint256 _utilb) internal{
utilBound = _utilb;
emit SetBounds(borrowBound, repayBound, _utilb);
}
function deposit(uint256 _assets, address _receiver) external returns (uint256 shares){
if (_assets > 0) {
shares = previewDeposit(_assets);
if(shares > 0){
_mint(_receiver, shares);
IERC20(stakingToken).safeTransferFrom(msg.sender, address(this), _assets);
updateBalances();
emit Deposit(msg.sender, _receiver, _assets, shares);
}
}
}
function mint(uint256 _shares, address _receiver) external override returns (uint256 assets){
if (_shares > 0) {
assets = previewMint(_shares);
if(assets > 0){
_mint(_receiver, _shares);
IERC20(stakingToken).safeTransferFrom(msg.sender, address(this), assets);
updateBalances();
emit Deposit(msg.sender, _receiver, assets, _shares);
}
}
}
function redeem(uint256 _shares, address _receiver, address _owner) public override returns (uint256 assets){
if (_shares > 0) {
if (msg.sender != _owner) {
_spendAllowance(_owner, msg.sender, _shares);
}
assets = previewRedeem(_shares);
require(assets != 0, "ZERO_ASSETS");
_burn(_owner, _shares);
_removeCollateral(assets);
IERC20(stakingToken).safeTransfer(_receiver, assets);
updateBalances(); //update balances after collateral has been sent back
emit Withdraw(msg.sender, _receiver, _owner, _shares, assets);
}
}
function withdraw(uint256 _amount, address _receiver, address _owner) public override returns(uint256 shares){
if (_amount > 0) {
shares = previewWithdraw(_amount);
if (msg.sender != _owner) {
_spendAllowance(_owner, msg.sender, shares);
}
_burn(_owner, shares);
_removeCollateral(_amount);
IERC20(stakingToken).safeTransfer(_receiver, _amount);
updateBalances(); //update balances after collateral has been sent back
emit Withdraw(msg.sender, _receiver, msg.sender, shares, _amount);
}
}
//erc4626
function asset() external view returns(address){
return stakingToken;
}
function totalAssets() public view returns(uint256 assets){
assets = IERC20(stakingToken).balanceOf(address(this));
assets += IFraxLend(fraxlend).userCollateralBalance(address(this));
}
function convertToShares(uint256 _assets) public override view returns (uint256 shares){
if (totalSupply() == 0) {
shares = _assets;
} else {
shares = _assets * totalSupply() / totalAssets();
}
}
function convertToAssets(uint256 _shares) public override view returns (uint256 assets){
if(totalSupply() > 0){
assets = totalAssets() * _shares / totalSupply();
}else{
assets = _shares;
}
}
function convertToSharesRoundUp(uint256 _assets) internal view returns (uint256 shares){
if (totalSupply() == 0) {
shares = _assets;
} else {
shares = _assets * totalSupply() / totalAssets();
if ( shares * totalAssets() / totalSupply() < _assets) {
shares = shares+1;
}
}
}
function convertToAssetsRoundUp(uint256 _shares) internal view returns (uint256 assets){
if(totalSupply() > 0){
assets = totalAssets() * _shares / totalSupply();
if ( assets * totalSupply() / totalAssets() < _shares) {
assets = assets+1;
}
}else{
assets = _shares;
}
}
function maxDeposit(address /*_receiver*/) external override pure returns (uint256){
return type(uint256).max;
}
function maxMint(address /*_receiver*/) external override pure returns (uint256){
return type(uint256).max;
}
function previewDeposit(uint256 _amount) public override view returns (uint256){
return convertToShares(_amount);
}
function previewMint(uint256 _shares) public override view returns (uint256){
return convertToAssetsRoundUp(_shares); //round up
}
function maxWithdraw(address _owner) external override view returns (uint256){
return convertToAssets(balanceOf(_owner));
}
function previewWithdraw(uint256 _amount) public override view returns (uint256){
return convertToSharesRoundUp(_amount); //round up
}
function maxRedeem(address _owner) external override view returns (uint256){
return balanceOf(_owner);
}
function previewRedeem(uint256 _shares) public override view returns (uint256){
return convertToAssets(_shares);
}
//get our max borrowable amount
function maxBorrowable(uint256 _collateralAmount, uint256 _utilityBounds) public view returns (uint256) {
IFraxLend.ExchangeRateInfo memory exInfo = IFraxLend(fraxlend).exchangeRateInfo();
//look directly at oracle to keep this a view function
(,,uint256 exchangeRate) = IDualOracle(exInfo.oracle).getPrices();
uint256 maxltv = IFraxLend(fraxlend).maxLTV();
//calc our max borrowable based on max ltv, the collateral amount, and the current exchange rate
//exchange rate is borrow token value/collateral token value
//thus in fxb case should be above 1.0 and trend down to 1.0 at maturity
uint256 maxborrow = maxltv * _collateralAmount * EXCHANGE_PRECISION / LTV_PRECISION / exchangeRate;
//get our current borrowed
uint256 borrowshares = IFraxLend(fraxlend).userBorrowShares(address(this));
uint256 borrowamount = IFraxLend(fraxlend).toBorrowAmount(borrowshares,true,true);
//calculate utilization bounds using updated interest fees
(,,,,IFraxLend.VaultAccount memory totalAsset, IFraxLend.VaultAccount memory totalBorrow) = IFraxLend(fraxlend).previewAddInterest();
uint256 totallending = totalAsset.amount;
uint256 totalborrowed = totalBorrow.amount;
//remove current borrowed amount as we are considering what our full position could be
totalborrowed = totalborrowed > borrowamount ? totalborrowed - borrowamount : 0;
//available for us to use
uint256 available = totallending - totalborrowed;
//only use whats available above a utilization threshold
uint256 utilbuffer = totallending * (LTV_PRECISION-_utilityBounds) / LTV_PRECISION;
available = available > utilbuffer ? available - utilbuffer : 0;
//if our ltv is above available, clamp to available
maxborrow = maxborrow > available ? available : maxborrow;
return maxborrow;
}
function _addCollateral() internal{
uint256 balance = IERC20(stakingToken).balanceOf(address(this));
if(balance > 0){
IFraxLend(fraxlend).addCollateral(balance, address(this));
}
}
function _removeCollateral(uint256 _amount) internal{
uint256 balance = IERC20(stakingToken).balanceOf(address(this));
if(_amount > balance){
//repay
_repayShares(IFraxLend(fraxlend).userBorrowShares(address(this)));
//remove
IFraxLend(fraxlend).removeCollateral(_amount - balance, address(this));
}
}
function _borrow(uint256 _amount) internal{
if(_amount > 0){
//update exchange rates (will be called anyway in borrow and cheap on second call if same block)
(bool isBorrowAllowed,,) = IFraxLend(fraxlend).updateExchangeRate();
if(isBorrowAllowed){
//borrow
IFraxLend(fraxlend).borrowAsset(_amount, IERC20(stakingToken).balanceOf(address(this)), address(this));
}
}
//deposit to sfrax any frax available
uint256 fraxbalance = IERC20(frax).balanceOf(address(this));
if(IERC4626(sfraxVault).previewDeposit(fraxbalance) > 0){
IERC4626(sfraxVault).deposit(fraxbalance, address(this));
}
}
function _repayShares(uint256 _shares) internal{
if(_shares > 0){
//withdraw from sfrax
IERC4626(sfraxVault).redeem(IERC20(sfrax).balanceOf(address(this)), address(this), address(this));
//repay
IFraxLend(fraxlend).repayAsset(_shares,address(this));
}
}
//collateral added or removed. update borrowing
function updateBalances() public{
//exit gracefully if paused
if(isPaused) return;
//if operator is a contract, see if it needs to update
if(operator != address(0) && operator.code.length > 0){
try ICvxFXBOperator(operator).calcUtilBounds() returns(uint256 ubounds){
//check if valid bounds, if over just ignore
if(ubounds < LTV_PRECISION){
_setUtilBounds(ubounds);
}
}catch{}
}
//get max borrow and bounds
uint256 maxborrow = maxBorrowable(totalAssets(),utilBound);
uint256 borrowbound = maxborrow * borrowBound / LTV_PRECISION;
uint256 repaybound = maxborrow * repayBound / LTV_PRECISION;
//get current borrow amount
uint256 borrowshares = IFraxLend(fraxlend).userBorrowShares(address(this));
uint256 borrowamount = IFraxLend(fraxlend).toBorrowAmount(borrowshares,true,true);
if(borrowamount > repaybound){
//repay and reset back to borrow bound
_repayShares(borrowshares);
_borrow(borrowbound);
}else if(borrowbound > borrowamount){
//borrow more up to bound
_borrow(borrowbound - borrowamount);
}else{
//else keep borrowing as is. update any loose underlying or frax
_addCollateral();
_borrow(0);
}
}
//process rewards
//sends frax to an outside contract to process
//this is trust minimalized by repaying all debt first
//so that no borrowed frax can be sent out
function processRewards() external{
require(swapper != address(0),"!swapper");
//first repay everything and withdraw from sfrax
_repayShares(IFraxLend(fraxlend).userBorrowShares(address(this)));
//get frax left over
uint256 fraxbalance = IERC20(frax).balanceOf(address(this));
//leave a buffer in case there are gaps between sfrax reward cycles etc
require(fraxbalance > swapbuffer,"!buffer");
fraxbalance -= swapbuffer;
//take fees
if(feeCollector != address(0) && fee > 0){
uint256 feeamount = fraxbalance * fee / LTV_PRECISION;
IERC20(frax).transfer(feeCollector, feeamount);
fraxbalance -= feeamount;
}
//send remaining to swapper and process
IERC20(frax).transfer(swapper, fraxbalance);
IRewardReceiver(swapper).processRewards();
//update balances after complete
updateBalances();
}
//helper function
//get difference of outstanding debt vs frax available
//note, does not take swapbuffer into account
function getProfit() external view returns(int256){
uint256 borrowshares = IFraxLend(fraxlend).userBorrowShares(address(this));
uint256 borrowamount = IFraxLend(fraxlend).toBorrowAmount(borrowshares,true,true);
uint256 fraxb = IERC4626(sfraxVault).maxWithdraw(address(this));
return int256(fraxb) - int256(borrowamount);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
interface IRewardReceiver {
function processRewards() external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
interface IFraxLend {
struct VaultAccount {
uint128 amount; // Total amount, analogous to market cap
uint128 shares; // Total shares, analogous to shares outstanding
}
struct CurrentRateInfo {
uint32 lastBlock;
uint32 feeToProtocolRate; // Fee amount 1e5 precision
uint64 lastTimestamp;
uint64 ratePerSec;
uint64 fullUtilizationRate;
}
struct ExchangeRateInfo {
address oracle;
uint32 maxOracleDeviation; // % of larger number, 1e5 precision
uint184 lastTimestamp;
uint256 lowExchangeRate;
uint256 highExchangeRate;
}
function collateralContract() external view returns(address);
function toBorrowAmount(
uint256 _shares,
bool _roundUp,
bool _previewInterest
) external view returns (uint256 _amount);
function totalBorrow() external view returns(uint256 assets, uint256 shares);
function totalAsset() external view returns(uint256 assets, uint256 shares);
function totalAssets() external view returns(uint256 assets);
function maxLTV() external view returns(uint256);
function userCollateralBalance(address _user) external view returns(uint256);
function userBorrowShares(address _user) external view returns(uint256);
function borrowAsset(
uint256 _borrowAmount,
uint256 _collateralAmount,
address _receiver
) external returns (uint256 _shares);
function addCollateral(uint256 _collateralAmount, address _borrower) external;
function removeCollateral(
uint256 _collateralAmount,
address _receiver
) external;
function repayAsset(uint256 _shares, address _borrower) external returns (uint256 _amountToRepay);
function currentRateInfo() external view returns(CurrentRateInfo memory info);
function exchangeRateInfo() external view returns(ExchangeRateInfo memory info);
function updateExchangeRate()
external
returns (bool _isBorrowAllowed, uint256 _lowExchangeRate, uint256 _highExchangeRate);
function addInterest(
bool _returnAccounting
)
external
returns (
uint256 _interestEarned,
uint256 _feesAmount,
uint256 _feesShare,
CurrentRateInfo memory _currentRateInfo,
VaultAccount memory _totalAsset,
VaultAccount memory _totalBorrow
);
function previewAddInterest()
external
view
returns (
uint256 _interestEarned,
uint256 _feesAmount,
uint256 _feesShare,
CurrentRateInfo memory _newCurrentRateInfo,
VaultAccount memory _totalAsset,
VaultAccount memory _totalBorrow
);
function rateContract() external view returns(address);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
interface IERC4626 {
function asset() external view returns (address);
function totalAssets() external view returns (uint256);
function convertToShares(uint256 assets) external view returns (uint256 shares);
function convertToAssets(uint256 shares) external view returns (uint256 assets);
function maxDeposit(address receiver) external view returns (uint256);
function previewDeposit(uint256 assets) external view returns (uint256);
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
function maxMint(address receiver) external view returns (uint256);
function previewMint(uint256 shares) external view returns (uint256);
function mint(uint256 shares, address receiver) external returns (uint256 assets);
function maxWithdraw(address owner) external view returns (uint256);
function previewWithdraw(uint256 assets) external view returns (uint256);
function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
function maxRedeem(address owner) external view returns (uint256);
function previewRedeem(uint256 shares) external view returns (uint256);
function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
interface IDualOracle {
function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh);
function decimals() external view returns (uint8);
function oracleType() external view returns (uint256);
function name() external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.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;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
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));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
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");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @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).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// 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 cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "london",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_fxb","type":"address"},{"internalType":"address","name":"_lend","type":"address"},{"internalType":"address","name":"_frax","type":"address"},{"internalType":"address","name":"_sfrax","type":"address"},{"internalType":"address","name":"_sfraxVault","type":"address"},{"internalType":"address","name":"_migratorRole","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"MigrationRoleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_borrow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_repay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_util","type":"uint256"}],"name":"SetBounds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_fees","type":"uint256"}],"name":"SetFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetMigrationContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_paused","type":"bool"}],"name":"SetPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetPendingMigrationRole","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetPendingOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"SetSwapBuffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"SetSwapper","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"EXCHANGE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LTV_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptPendingMigrationRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fraxlend","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collateralAmount","type":"uint256"},{"internalType":"uint256","name":"_utilityBounds","type":"uint256"}],"name":"maxBorrowable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migratorRole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMigratorRole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repayBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_borrowb","type":"uint256"},{"internalType":"uint256","name":"_repayb","type":"uint256"},{"internalType":"uint256","name":"_utilb","type":"uint256"}],"name":"setBounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrateContract","type":"address"}],"name":"setMigrationContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_o","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pmr","type":"address"}],"name":"setPendingMigrationRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_po","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setSwapBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swap","type":"address"}],"name":"setSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_utilb","type":"uint256"}],"name":"setUtilBounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sfrax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sfraxVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapbuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utilBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60e06040523480156200001157600080fd5b50604051620044f9380380620044f9833981016040819052620000349162000594565b604080518082018252600b81526a2bb930b83832b210232c2160a91b6020808301918252835180850190945260048452633ba32c2160e11b9084015281519192916200008391600391620004d1565b50805162000099906004906020840190620004d1565b5050600160055550600680546001600160a01b03199081166001600160a01b038981169190911790925560078054821688841617905585821660805284821660a05290831660c052600a8054339216821790556040517fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3690600090a2600880546001600160a01b031916339081179091556040517fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee90600090a2600c80546001600160a01b0319166001600160a01b0383169081179091556040517f1ab379af91e470eda0c8423ad0c73ac7a10b0f2ae848d8ac63533ccf6a158b3a90600090a262017ae86011819055620182b8601281905562017318601381905560408051938452602084019290925282820152517f638b7ccf601c8f4f816a23432b2026b5300c3bbb605a737d3a0dd5e2228b8b279181900360600190a160805160c05160405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156200024a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000270919062000615565b5060a05160c05160405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015620002c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ee919062000615565b5060805160075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000346573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036c919062000615565b5060065460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015620003c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ea919062000615565b50620003ff30670de0b6b3a76400006200040b565b505050505050620006a4565b6001600160a01b038216620004665760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200047a919062000640565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b828054620004df9062000667565b90600052602060002090601f0160209004810192826200050357600085556200054e565b82601f106200051e57805160ff19168380011785556200054e565b828001600101855582156200054e579182015b828111156200054e57825182559160200191906001019062000531565b506200055c92915062000560565b5090565b5b808211156200055c576000815560010162000561565b80516001600160a01b03811681146200058f57600080fd5b919050565b60008060008060008060c08789031215620005ae57600080fd5b620005b98762000577565b9550620005c96020880162000577565b9450620005d96040880162000577565b9350620005e96060880162000577565b9250620005f96080880162000577565b91506200060960a0880162000577565b90509295509295509295565b6000602082840312156200062857600080fd5b815180151581146200063957600080fd5b9392505050565b600082198211156200066257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200067c57607f821691505b602082108114156200069e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051613ddf6200071a6000396000818161076201528181610ebe015281816129140152818161303c01526130c901526000818161059b015261293e01526000818161065a015281816117850152818161240f0152818161253a015281816125df0152612fa50152613ddf6000f3fe608060405234801561001057600080fd5b50600436106103f15760003560e01c806394bf804d11610215578063c415b95c11610125578063d905777e116100b8578063e30c397811610087578063e30c397814610863578063ef8b30f714610876578063f9fc0d0714610889578063fdb5fe3e14610891578063ff61a51c146108a457600080fd5b8063d905777e1461082b578063da3c54261461083e578063dd62ed3e14610847578063ddca3f431461085a57600080fd5b8063c6e6f592116100f4578063c6e6f592146107e9578063c816b164146107fc578063cd634ea714610805578063ce96cb771461081857600080fd5b8063c415b95c146107b0578063c42069ec146107c3578063c591977c146107d6578063c63d75b61461054857600080fd5b8063a9d3f15f116101a8578063b460af9411610177578063b460af941461074a578063b56701161461075d578063b78294dd14610784578063ba0876521461078e578063c0a7e892146107a157600080fd5b8063a9d3f15f1461070f578063b187bd2614610717578063b3ab15fb14610724578063b3d7f6b91461073757600080fd5b8063a2f19cab116101e4578063a2f19cab146106cd578063a457c2d7146106d6578063a5dc64d3146106e9578063a9059cbb146106fc57600080fd5b806394bf804d1461069757806395d89b41146106aa57806399f4a389146106b25780639c82f2a4146106ba57600080fd5b80633e587cb3116103105780636e553f65116102a35780637d738456116102725780637d7384561461062f57806388b79cec1461064257806389b4ec8e146106555780638da5cb5b1461067c5780638fd3ab801461068f57600080fd5b80636e553f65146105d85780636f3fe404146105eb57806370a08231146105f357806372f702f31461061c57600080fd5b80635e5c6ada116102df5780635e5c6ada14610583578063637b2b3414610596578063666e2e8b146105bd578063679dffb4146105d057600080fd5b80633e587cb314610535578063402d267d146105485780634cdad5061461055d578063570ca7351461057057600080fd5b806318160ddd116103885780632c932ee7116103575780632c932ee7146104ef578063313ce5671461050257806338d52e0f14610511578063395093511461052257600080fd5b806318160ddd146104b85780631deadaad146104c057806323b872dd146104c95780632b3297f9146104dc57600080fd5b80630a28a477116103c45780630a28a4771461045c5780630fee1a201461046f5780631365f8e71461049a57806316c38b3c146104a357600080fd5b806301e1d114146103f657806306fdde031461041157806307a2d13a14610426578063095ea7b314610439575b600080fd5b6103fe6108ad565b6040519081526020015b60405180910390f35b610419610996565b6040516104089190613771565b6103fe6104343660046137a4565b610a28565b61044c6104473660046137d2565b610a68565b6040519015158152602001610408565b6103fe61046a3660046137a4565b610a80565b600e54610482906001600160a01b031681565b6040516001600160a01b039091168152602001610408565b6103fe60115481565b6104b66104b136600461380c565b610a8b565b005b6002546103fe565b6103fe60125481565b61044c6104d7366004613829565b610b80565b601454610482906001600160a01b031681565b600754610482906001600160a01b031681565b60405160128152602001610408565b6006546001600160a01b0316610482565b61044c6105303660046137d2565b610ba6565b600d54610482906001600160a01b031681565b6103fe61055636600461386a565b5060001990565b6103fe61056b3660046137a4565b610bc8565b600854610482906001600160a01b031681565b6104b66105913660046137d2565b610bd3565b6104827f000000000000000000000000000000000000000000000000000000000000000081565b6104b66105cb366004613887565b610c97565b6103fe610da9565b6103fe6105e63660046138b3565b610f3d565b6104b6610fcd565b6103fe61060136600461386a565b6001600160a01b031660009081526020819052604090205490565b600654610482906001600160a01b031681565b6104b661063d3660046137a4565b61122e565b6104b661065036600461386a565b6112bd565b6104827f000000000000000000000000000000000000000000000000000000000000000081565b600a54610482906001600160a01b031681565b6104b6611349565b6103fe6106a53660046138b3565b6118fb565b610419611981565b6104b6611990565b6104b66106c836600461386a565b611a3f565b6103fe60135481565b61044c6106e43660046137d2565b611ab3565b600c54610482906001600160a01b031681565b61044c61070a3660046137d2565b611b39565b6104b6611b47565b60105461044c9060ff1681565b6104b661073236600461386a565b611bfe565b6103fe6107453660046137a4565b611cad565b6103fe6107583660046138e3565b611cb8565b6104827f000000000000000000000000000000000000000000000000000000000000000081565b6103fe620186a081565b6103fe61079c3660046138e3565b611d68565b6103fe670de0b6b3a764000081565b601554610482906001600160a01b031681565b6104b66107d136600461386a565b611e4b565b6103fe6107e4366004613925565b611ebf565b6103fe6107f73660046137a4565b612270565b6103fe60095481565b6104b661081336600461386a565b612298565b6103fe61082636600461386a565b61230c565b6103fe61083936600461386a565b61232e565b6103fe60175481565b6103fe610855366004613947565b61234c565b6103fe60165481565b600b54610482906001600160a01b031681565b6103fe6108843660046137a4565b612377565b6104b6612382565b6104b661089f3660046137a4565b6126c2565b6103fe600f5481565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190613975565b600754604051635ad7983160e11b81523060048201529192506001600160a01b03169063b5af306290602401602060405180830381865afa158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613975565b61099190826139a4565b905090565b6060600380546109a5906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906139bc565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b5050505050905090565b600080610a3460025490565b1115610a605760025482610a466108ad565b610a5091906139f7565b610a5a9190613a16565b92915050565b50805b919050565b600033610a76818585612762565b5060019392505050565b6000610a5a82612886565b600a546001600160a01b03163314610abe5760405162461bcd60e51b8152600401610ab590613a38565b60405180910390fd5b8015610b3857600754604051634fd422df60e01b8152306004820152610b38916001600160a01b031690634fd422df906024015b602060405180830381865afa158015610b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b339190613975565b6128f1565b6010805460ff19168215159081179091556040519081527f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b5980906020015b60405180910390a150565b600033610b8e858285612a92565b610b99858585612b0c565b60019150505b9392505050565b600033610a76818585610bb9838361234c565b610bc391906139a4565b612762565b6000610a5a82610a28565b600a546001600160a01b03163314610bfd5760405162461bcd60e51b8152600401610ab590613a38565b61c350811115610c3d5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b6044820152606401610ab5565b601580546001600160a01b0319166001600160a01b03841690811790915560168290556040518281527fab49ce08e11cc0376543c4232c2f51840768e17cf8b664eb4d91f0b713d959189060200160405180910390a25050565b600a546001600160a01b03163314610cc15760405162461bcd60e51b8152600401610ab590613a38565b610ccd836103e86139a4565b8210158015610cdf5750620182b88211155b610d175760405162461bcd60e51b815260206004820152600960248201526807265706179206761760bc1b6044820152606401610ab5565b620186a08110610d545760405162461bcd60e51b815260206004820152600860248201526707574696c206761760c41b6044820152606401610ab5565b60118390556012829055601381905560408051848152602081018490529081018290527f638b7ccf601c8f4f816a23432b2026b5300c3bbb605a737d3a0dd5e2228b8b279060600160405180910390a1505050565b600754604051634fd422df60e01b815230600482015260009182916001600160a01b0390911690634fd422df90602401602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190613975565b60405163ce96cb7760e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ce96cb7790602401602060405180830381865afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190613975565b9050610f358282613a59565b935050505090565b60008215610a5a57610f4e83612377565b90508015610a5a57610f608282612cb0565b600654610f78906001600160a01b0316333086612d6f565b610f80610fcd565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b60105460ff1615610fda57565b6008546001600160a01b031615801590610fff57506008546001600160a01b03163b15155b1561109257600860009054906101000a90046001600160a01b03166001600160a01b031663c3fa18f86040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611073575060408051601f3d908101601f1916820190925261107091810190613975565b60015b61107c57611092565b620186a08110156110905761109081612dda565b505b60006110a761109f6108ad565b601354611ebf565b90506000620186a0601154836110bd91906139f7565b6110c79190613a16565b90506000620186a0601254846110dd91906139f7565b6110e79190613a16565b600754604051634fd422df60e01b81523060048201529192506000916001600160a01b0390911690634fd422df90602401602060405180830381865afa158015611135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111599190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa1580156111b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111da9190613975565b9050828111156111fb576111ed826128f1565b6111f684612e23565b611227565b80841115611215576111f66112108286613a98565b612e23565b61121d613143565b6112276000612e23565b5050505050565b600a546001600160a01b031633148061125157506008546001600160a01b031633145b6112885760405162461bcd60e51b8152602060048201526008602482015267042dee0bec2eae8d60c31b6044820152606401610ab5565b60178190556040518181527f7ee8bd1d5d095460af4deec40b7e80a79e143f16e262e6a6f7e92e0dce26255090602001610b75565b600c546001600160a01b031633146112e75760405162461bcd60e51b8152600401610ab590613aaf565b600e80546001600160a01b0319166001600160a01b03831617905561130f4262093a806139a4565b600f556040516001600160a01b038216907f68312d2b0a7e09cd6d48631206e7cc8f0a31d4dea67df512d102a4d57d4a27bf90600090a250565b600c546001600160a01b031633146113735760405162461bcd60e51b8152600401610ab590613aaf565b600e546001600160a01b03166113b85760405162461bcd60e51b815260206004820152600a602482015269085b58dbdb9d1c9858dd60b21b6044820152606401610ab5565b600f544210156113f35760405162461bcd60e51b8152602060048201526006602482015265216d74696d6560d01b6044820152606401610ab5565b600754604051634fd422df60e01b8152306004820152611425916001600160a01b031690634fd422df90602401610af2565b600754604051635ad7983160e11b81523060048201526001600160a01b039091169063d41ddc9690829063b5af306290602401602060405180830381865afa158015611475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190613975565b6040516001600160e01b031960e084901b1681526004810191909152306024820152604401600060405180830381600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b5050600e546006546040516370a0823160e01b815230600482015261157994506001600160a01b0392831693509116906370a0823190602401602060405180830381865afa158015611542573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115669190613975565b6006546001600160a01b03169190613218565b600e60009054906101000a90046001600160a01b03166001600160a01b0316632c932ee76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f09190613ad0565b600780546001600160a01b0319166001600160a01b039290921691821790556040805163c6e1c7c960e01b8152905163c6e1c7c9916004808201926020929091908290030181865afa15801561164a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166e9190613ad0565b600680546001600160a01b0319166001600160a01b03928316179055600e546040805163011fa75760e71b815290519190921691638fd3ab8091600480830192600092919082900301818387803b1580156116c857600080fd5b505af11580156116dc573d6000803e3d6000fd5b505060065460075460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529116925063095ea7b391506044016020604051808303816000875af1158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190613aed565b5060075460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303816000875af11580156117d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f49190613aed565b50600e80546001600160a01b03191690556040516000907f68312d2b0a7e09cd6d48631206e7cc8f0a31d4dea67df512d102a4d57d4a27bf908290a2601480546001600160a01b03191690556040516000907f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd908290a26010805460ff191660019081179091556040519081527f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809060200160405180910390a1600880546001600160a01b03191690556118cb4262093a806139a4565b6009556040516000907fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee908290a2565b60008215610a5a5761190c83611cad565b90508015610a5a5761191e8284612cb0565b600654611936906001600160a01b0316333084612d6f565b61193e610fcd565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610fbf565b6060600480546109a5906139bc565b600b546001600160a01b0316158015906119b45750600b546001600160a01b031633145b6119eb5760405162461bcd60e51b815260206004820152600860248201526710b82fb7bbb732b960c11b6044820152606401610ab5565b600b8054600a80546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3690600090a2565b600a546001600160a01b03163314611a695760405162461bcd60e51b8152600401610ab590613a38565b601480546001600160a01b0319166001600160a01b0383169081179091556040517f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd90600090a250565b60003381611ac1828661234c565b905083811015611b215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab5565b611b2e8286868403612762565b506001949350505050565b600033610a76818585612b0c565b600d546001600160a01b031615801590611b6b5750600d546001600160a01b031633145b611baa5760405162461bcd60e51b815260206004820152601060248201526f21705f6d6967726174696f6e526f6c6560801b6044820152606401610ab5565b600d8054600c80546001600160a01b0383166001600160a01b031991821681179092559091169091556040517f1ab379af91e470eda0c8423ad0c73ac7a10b0f2ae848d8ac63533ccf6a158b3a90600090a2565b600a546001600160a01b03163314611c285760405162461bcd60e51b8152600401610ab590613a38565b600954421015611c635760405162461bcd60e51b8152602060048201526006602482015265216f74696d6560d01b6044820152606401610ab5565b600880546001600160a01b0319166001600160a01b0383169081179091556040517fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee90600090a250565b6000610a5a82613248565b60008315610b9f57611cc984610a80565b9050336001600160a01b03831614611ce657611ce6823383612a92565b611cf08282613292565b611cf9846133c4565b600654611d10906001600160a01b03168486613218565b611d18610fcd565b604080518281526020810186905233916001600160a01b0386169183917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db91015b60405180910390a49392505050565b60008315610b9f57336001600160a01b03831614611d8b57611d8b823386612a92565b611d9484610bc8565b905080611dd15760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b6044820152606401610ab5565b611ddb8285613292565b611de4816133c4565b600654611dfb906001600160a01b03168483613218565b611e03610fcd565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db9101611d59565b600a546001600160a01b03163314611e755760405162461bcd60e51b8152600401610ab590613a38565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f5f4861af37461865f168c6e320428b3141f409a1763bd61b6359d38ad38ae74c90600090a250565b600080600760009054906101000a90046001600160a01b03166001600160a01b031663fbbbf94c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190613b55565b9050600081600001516001600160a01b031663bd9a548b6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa39190613bf5565b925050506000600760009054906101000a90046001600160a01b03166001600160a01b031663f384bd056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190613975565b9050600082620186a0670de0b6b3a764000061203c8a866139f7565b61204691906139f7565b6120509190613a16565b61205a9190613a16565b600754604051634fd422df60e01b81523060048201529192506000916001600160a01b0390911690634fd422df90602401602060405180830381865afa1580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc9190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190613975565b9050600080600760009054906101000a90046001600160a01b03166001600160a01b031663cacf3b586040518163ffffffff1660e01b815260040161018060405180830381865afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190613cc7565b815181519298509096506001600160801b03908116955016925050508481116121f45760006121fe565b6121fe8582613a98565b9050600061220c8284613a98565b90506000620186a061221e8f82613a98565b61222890866139f7565b6122329190613a16565b905080821161224257600061224c565b61224c8183613a98565b915081891161225b578861225d565b815b9f9e505050505050505050505050505050565b600061227b60025490565b612283575090565b61228b6108ad565b600254610a5090846139f7565b600c546001600160a01b031633146122c25760405162461bcd60e51b8152600401610ab590613aaf565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2c5cb9b16b24763e86019f9d3f1453912c5bb2ed9139f179fedb3511b42ba36390600090a250565b6001600160a01b038116600090815260208190526040812054610a5a90610a28565b6001600160a01b038116600090815260208190526040812054610a5a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610a5a82612270565b6014546001600160a01b03166123c55760405162461bcd60e51b815260206004820152600860248201526710b9bbb0b83832b960c11b6044820152606401610ab5565b600754604051634fd422df60e01b81523060048201526123f7916001600160a01b031690634fd422df90602401610af2565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561245e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124829190613975565b905060175481116124bf5760405162461bcd60e51b815260206004820152600760248201526610b13ab33332b960c91b6044820152606401610ab5565b6017546124cc9082613a98565b6015549091506001600160a01b0316158015906124eb57506000601654115b156125b6576000620186a06016548361250491906139f7565b61250e9190613a16565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190613aed565b506125b28183613a98565b9150505b60145460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af115801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e9190613aed565b50601460009054906101000a90046001600160a01b03166001600160a01b031663f9fc0d076040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561269f57600080fd5b505af11580156126b3573d6000803e3d6000fd5b505050506126bf610fcd565b50565b600a546001600160a01b03163314806126e557506008546001600160a01b031633145b61271c5760405162461bcd60e51b8152602060048201526008602482015267042dee0bec2eae8d60c31b6044820152606401610ab5565b620186a081106127595760405162461bcd60e51b815260206004820152600860248201526707574696c206761760c41b6044820152606401610ab5565b6126bf81612dda565b6001600160a01b0383166127c45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b6001600160a01b0382166128255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061289160025490565b612899575090565b6128a16108ad565b6002546128ae90846139f7565b6128b89190613a16565b9050816128c460025490565b6128cc6108ad565b6128d690846139f7565b6128e09190613a16565b1015610a6357610a5a8160016139a4565b80156126bf576040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163ba087652917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a99190613975565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303816000875af11580156129f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a189190613975565b50600754604051633d417d2d60e01b8152600481018390523060248201526001600160a01b0390911690633d417d2d906044016020604051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613975565b5050565b6000612a9e848461234c565b90506000198114612b065781811015612af95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab5565b612b068484848403612762565b50505050565b6001600160a01b038316612b705760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ab5565b6001600160a01b038216612bd25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ab5565b6001600160a01b03831660009081526020819052604090205481811015612c4a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab5565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612b06565b6001600160a01b038216612d065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ab5565b8060026000828254612d1891906139a4565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052612b069085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134e3565b601381905560115460125460408051928352602083019190915281018290527f638b7ccf601c8f4f816a23432b2026b5300c3bbb605a737d3a0dd5e2228b8b2790606001610b75565b8015612f8d57600754604080516302ce728f60e01b815290516000926001600160a01b0316916302ce728f916004808301926060929190829003018187875af1158015612e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e989190613bf5565b505090508015612f8b576007546006546040516370a0823160e01b81523060048201526001600160a01b039283169263e5f13b169286929116906370a0823190602401602060405180830381865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613975565b6040516001600160e01b031960e085901b168152600481019290925260248201523060448201526064016020604051808303816000875af1158015612f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f899190613975565b505b505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130189190613975565b60405163ef8b30f760e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ef8b30f790602401602060405180830381865afa158015613083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a79190613975565b1115612a8e57604051636e553f6560e01b8152600481018290523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636e553f65906044016020604051808303816000875af115801561311a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313e9190613975565b505050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561318c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b09190613975565b905080156126bf5760075460405163cadac47960e01b8152600481018390523060248201526001600160a01b039091169063cadac47990604401600060405180830381600087803b15801561320457600080fd5b505af1158015611227573d6000803e3d6000fd5b6040516001600160a01b03831660248201526044810182905261313e90849063a9059cbb60e01b90606401612da3565b60008061325460025490565b1115610a6057600254826132666108ad565b61327091906139f7565b61327a9190613a16565b9050816132856108ad565b6002546128d690846139f7565b6001600160a01b0382166132f25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab5565b6001600160a01b038216600090815260208190526040902054818110156133665760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab5565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561340d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134319190613975565b905080821115612a8e57600754604051634fd422df60e01b815230600482015261346d916001600160a01b031690634fd422df90602401610af2565b6007546001600160a01b031663d41ddc966134888385613a98565b6040516001600160e01b031960e084901b1681526004810191909152306024820152604401600060405180830381600087803b1580156134c757600080fd5b505af11580156134db573d6000803e3d6000fd5b505050505050565b6000613538826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135b89092919063ffffffff16565b90508051600014806135595750808060200190518101906135599190613aed565b61313e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ab5565b60606135c784846000856135cf565b949350505050565b6060824710156136305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ab5565b600080866001600160a01b0316858760405161364c9190613d8d565b60006040518083038185875af1925050503d8060008114613689576040519150601f19603f3d011682016040523d82523d6000602084013e61368e565b606091505b509150915061369f878383876136aa565b979650505050505050565b6060831561371657825161370f576001600160a01b0385163b61370f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ab5565b50816135c7565b6135c7838381511561372b5781518083602001fd5b8060405162461bcd60e51b8152600401610ab59190613771565b60005b83811015613760578181015183820152602001613748565b83811115612b065750506000910152565b6020815260008251806020840152613790816040850160208701613745565b601f01601f19169190910160400192915050565b6000602082840312156137b657600080fd5b5035919050565b6001600160a01b03811681146126bf57600080fd5b600080604083850312156137e557600080fd5b82356137f0816137bd565b946020939093013593505050565b80151581146126bf57600080fd5b60006020828403121561381e57600080fd5b8135610b9f816137fe565b60008060006060848603121561383e57600080fd5b8335613849816137bd565b92506020840135613859816137bd565b929592945050506040919091013590565b60006020828403121561387c57600080fd5b8135610b9f816137bd565b60008060006060848603121561389c57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156138c657600080fd5b8235915060208301356138d8816137bd565b809150509250929050565b6000806000606084860312156138f857600080fd5b83359250602084013561390a816137bd565b9150604084013561391a816137bd565b809150509250925092565b6000806040838503121561393857600080fd5b50508035926020909101359150565b6000806040838503121561395a57600080fd5b8235613965816137bd565b915060208301356138d8816137bd565b60006020828403121561398757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156139b7576139b761398e565b500190565b600181811c908216806139d057607f821691505b602082108114156139f157634e487b7160e01b600052602260045260246000fd5b50919050565b6000816000190483118215151615613a1157613a1161398e565b500290565b600082613a3357634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266042debec2eae8d60cb1b604082015260600190565b60008083128015600160ff1b850184121615613a7757613a7761398e565b6001600160ff1b0384018313811615613a9257613a9261398e565b50500390565b600082821015613aaa57613aaa61398e565b500390565b602080825260079082015266042dabec2eae8d60cb1b604082015260600190565b600060208284031215613ae257600080fd5b8151610b9f816137bd565b600060208284031215613aff57600080fd5b8151610b9f816137fe565b60405160a0810167ffffffffffffffff81118282101715613b3b57634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff81168114610a6357600080fd5b600060a08284031215613b6757600080fd5b60405160a0810181811067ffffffffffffffff82111715613b9857634e487b7160e01b600052604160045260246000fd5b6040528251613ba6816137bd565b8152613bb460208401613b41565b602082015260408301516001600160b81b0381168114613bd357600080fd5b6040820152606083810151908201526080928301519281019290925250919050565b600080600060608486031215613c0a57600080fd5b8351613c15816137fe565b602085015160409095015190969495509392505050565b805167ffffffffffffffff81168114610a6357600080fd5b80516001600160801b0381168114610a6357600080fd5b600060408284031215613c6d57600080fd5b6040516040810181811067ffffffffffffffff82111715613c9e57634e487b7160e01b600052604160045260246000fd5b604052905080613cad83613c44565b8152613cbb60208401613c44565b60208201525092915050565b600080600080600080868803610180811215613ce257600080fd5b87519650602088015195506040880151945060a0605f1982011215613d0657600080fd5b50613d0f613b0a565b613d1b60608901613b41565b8152613d2960808901613b41565b6020820152613d3a60a08901613c2c565b6040820152613d4b60c08901613c2c565b6060820152613d5c60e08901613c2c565b60808201529250613d71886101008901613c5b565b9150613d81886101408901613c5b565b90509295509295509295565b60008251613d9f818460208701613745565b919091019291505056fea2646970667358221220e518665a6260be88fb9f4cc75fe640ba6034d7c5d7c3ba6aa8c6ad6e0b52b1df64736f6c634300080a0033000000000000000000000000f1e2b576af4c6a7ee966b14c810b772391e921530000000000000000000000003e92765ee2b009b104a8a7baf3759b159c19aba1000000000000000000000000fc00000000000000000000000000000000000001000000000000000000000000fc00000000000000000000000000000000000008000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b55000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103f15760003560e01c806394bf804d11610215578063c415b95c11610125578063d905777e116100b8578063e30c397811610087578063e30c397814610863578063ef8b30f714610876578063f9fc0d0714610889578063fdb5fe3e14610891578063ff61a51c146108a457600080fd5b8063d905777e1461082b578063da3c54261461083e578063dd62ed3e14610847578063ddca3f431461085a57600080fd5b8063c6e6f592116100f4578063c6e6f592146107e9578063c816b164146107fc578063cd634ea714610805578063ce96cb771461081857600080fd5b8063c415b95c146107b0578063c42069ec146107c3578063c591977c146107d6578063c63d75b61461054857600080fd5b8063a9d3f15f116101a8578063b460af9411610177578063b460af941461074a578063b56701161461075d578063b78294dd14610784578063ba0876521461078e578063c0a7e892146107a157600080fd5b8063a9d3f15f1461070f578063b187bd2614610717578063b3ab15fb14610724578063b3d7f6b91461073757600080fd5b8063a2f19cab116101e4578063a2f19cab146106cd578063a457c2d7146106d6578063a5dc64d3146106e9578063a9059cbb146106fc57600080fd5b806394bf804d1461069757806395d89b41146106aa57806399f4a389146106b25780639c82f2a4146106ba57600080fd5b80633e587cb3116103105780636e553f65116102a35780637d738456116102725780637d7384561461062f57806388b79cec1461064257806389b4ec8e146106555780638da5cb5b1461067c5780638fd3ab801461068f57600080fd5b80636e553f65146105d85780636f3fe404146105eb57806370a08231146105f357806372f702f31461061c57600080fd5b80635e5c6ada116102df5780635e5c6ada14610583578063637b2b3414610596578063666e2e8b146105bd578063679dffb4146105d057600080fd5b80633e587cb314610535578063402d267d146105485780634cdad5061461055d578063570ca7351461057057600080fd5b806318160ddd116103885780632c932ee7116103575780632c932ee7146104ef578063313ce5671461050257806338d52e0f14610511578063395093511461052257600080fd5b806318160ddd146104b85780631deadaad146104c057806323b872dd146104c95780632b3297f9146104dc57600080fd5b80630a28a477116103c45780630a28a4771461045c5780630fee1a201461046f5780631365f8e71461049a57806316c38b3c146104a357600080fd5b806301e1d114146103f657806306fdde031461041157806307a2d13a14610426578063095ea7b314610439575b600080fd5b6103fe6108ad565b6040519081526020015b60405180910390f35b610419610996565b6040516104089190613771565b6103fe6104343660046137a4565b610a28565b61044c6104473660046137d2565b610a68565b6040519015158152602001610408565b6103fe61046a3660046137a4565b610a80565b600e54610482906001600160a01b031681565b6040516001600160a01b039091168152602001610408565b6103fe60115481565b6104b66104b136600461380c565b610a8b565b005b6002546103fe565b6103fe60125481565b61044c6104d7366004613829565b610b80565b601454610482906001600160a01b031681565b600754610482906001600160a01b031681565b60405160128152602001610408565b6006546001600160a01b0316610482565b61044c6105303660046137d2565b610ba6565b600d54610482906001600160a01b031681565b6103fe61055636600461386a565b5060001990565b6103fe61056b3660046137a4565b610bc8565b600854610482906001600160a01b031681565b6104b66105913660046137d2565b610bd3565b6104827f000000000000000000000000fc0000000000000000000000000000000000000881565b6104b66105cb366004613887565b610c97565b6103fe610da9565b6103fe6105e63660046138b3565b610f3d565b6104b6610fcd565b6103fe61060136600461386a565b6001600160a01b031660009081526020819052604090205490565b600654610482906001600160a01b031681565b6104b661063d3660046137a4565b61122e565b6104b661065036600461386a565b6112bd565b6104827f000000000000000000000000fc0000000000000000000000000000000000000181565b600a54610482906001600160a01b031681565b6104b6611349565b6103fe6106a53660046138b3565b6118fb565b610419611981565b6104b6611990565b6104b66106c836600461386a565b611a3f565b6103fe60135481565b61044c6106e43660046137d2565b611ab3565b600c54610482906001600160a01b031681565b61044c61070a3660046137d2565b611b39565b6104b6611b47565b60105461044c9060ff1681565b6104b661073236600461386a565b611bfe565b6103fe6107453660046137a4565b611cad565b6103fe6107583660046138e3565b611cb8565b6104827f000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b5581565b6103fe620186a081565b6103fe61079c3660046138e3565b611d68565b6103fe670de0b6b3a764000081565b601554610482906001600160a01b031681565b6104b66107d136600461386a565b611e4b565b6103fe6107e4366004613925565b611ebf565b6103fe6107f73660046137a4565b612270565b6103fe60095481565b6104b661081336600461386a565b612298565b6103fe61082636600461386a565b61230c565b6103fe61083936600461386a565b61232e565b6103fe60175481565b6103fe610855366004613947565b61234c565b6103fe60165481565b600b54610482906001600160a01b031681565b6103fe6108843660046137a4565b612377565b6104b6612382565b6104b661089f3660046137a4565b6126c2565b6103fe600f5481565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190613975565b600754604051635ad7983160e11b81523060048201529192506001600160a01b03169063b5af306290602401602060405180830381865afa158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109879190613975565b61099190826139a4565b905090565b6060600380546109a5906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546109d1906139bc565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b5050505050905090565b600080610a3460025490565b1115610a605760025482610a466108ad565b610a5091906139f7565b610a5a9190613a16565b92915050565b50805b919050565b600033610a76818585612762565b5060019392505050565b6000610a5a82612886565b600a546001600160a01b03163314610abe5760405162461bcd60e51b8152600401610ab590613a38565b60405180910390fd5b8015610b3857600754604051634fd422df60e01b8152306004820152610b38916001600160a01b031690634fd422df906024015b602060405180830381865afa158015610b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b339190613975565b6128f1565b6010805460ff19168215159081179091556040519081527f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b5980906020015b60405180910390a150565b600033610b8e858285612a92565b610b99858585612b0c565b60019150505b9392505050565b600033610a76818585610bb9838361234c565b610bc391906139a4565b612762565b6000610a5a82610a28565b600a546001600160a01b03163314610bfd5760405162461bcd60e51b8152600401610ab590613a38565b61c350811115610c3d5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b6044820152606401610ab5565b601580546001600160a01b0319166001600160a01b03841690811790915560168290556040518281527fab49ce08e11cc0376543c4232c2f51840768e17cf8b664eb4d91f0b713d959189060200160405180910390a25050565b600a546001600160a01b03163314610cc15760405162461bcd60e51b8152600401610ab590613a38565b610ccd836103e86139a4565b8210158015610cdf5750620182b88211155b610d175760405162461bcd60e51b815260206004820152600960248201526807265706179206761760bc1b6044820152606401610ab5565b620186a08110610d545760405162461bcd60e51b815260206004820152600860248201526707574696c206761760c41b6044820152606401610ab5565b60118390556012829055601381905560408051848152602081018490529081018290527f638b7ccf601c8f4f816a23432b2026b5300c3bbb605a737d3a0dd5e2228b8b279060600160405180910390a1505050565b600754604051634fd422df60e01b815230600482015260009182916001600160a01b0390911690634fd422df90602401602060405180830381865afa158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa158015610e77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9b9190613975565b60405163ce96cb7760e01b81523060048201529091506000906001600160a01b037f000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b55169063ce96cb7790602401602060405180830381865afa158015610f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f299190613975565b9050610f358282613a59565b935050505090565b60008215610a5a57610f4e83612377565b90508015610a5a57610f608282612cb0565b600654610f78906001600160a01b0316333086612d6f565b610f80610fcd565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a392915050565b60105460ff1615610fda57565b6008546001600160a01b031615801590610fff57506008546001600160a01b03163b15155b1561109257600860009054906101000a90046001600160a01b03166001600160a01b031663c3fa18f86040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611073575060408051601f3d908101601f1916820190925261107091810190613975565b60015b61107c57611092565b620186a08110156110905761109081612dda565b505b60006110a761109f6108ad565b601354611ebf565b90506000620186a0601154836110bd91906139f7565b6110c79190613a16565b90506000620186a0601254846110dd91906139f7565b6110e79190613a16565b600754604051634fd422df60e01b81523060048201529192506000916001600160a01b0390911690634fd422df90602401602060405180830381865afa158015611135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111599190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa1580156111b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111da9190613975565b9050828111156111fb576111ed826128f1565b6111f684612e23565b611227565b80841115611215576111f66112108286613a98565b612e23565b61121d613143565b6112276000612e23565b5050505050565b600a546001600160a01b031633148061125157506008546001600160a01b031633145b6112885760405162461bcd60e51b8152602060048201526008602482015267042dee0bec2eae8d60c31b6044820152606401610ab5565b60178190556040518181527f7ee8bd1d5d095460af4deec40b7e80a79e143f16e262e6a6f7e92e0dce26255090602001610b75565b600c546001600160a01b031633146112e75760405162461bcd60e51b8152600401610ab590613aaf565b600e80546001600160a01b0319166001600160a01b03831617905561130f4262093a806139a4565b600f556040516001600160a01b038216907f68312d2b0a7e09cd6d48631206e7cc8f0a31d4dea67df512d102a4d57d4a27bf90600090a250565b600c546001600160a01b031633146113735760405162461bcd60e51b8152600401610ab590613aaf565b600e546001600160a01b03166113b85760405162461bcd60e51b815260206004820152600a602482015269085b58dbdb9d1c9858dd60b21b6044820152606401610ab5565b600f544210156113f35760405162461bcd60e51b8152602060048201526006602482015265216d74696d6560d01b6044820152606401610ab5565b600754604051634fd422df60e01b8152306004820152611425916001600160a01b031690634fd422df90602401610af2565b600754604051635ad7983160e11b81523060048201526001600160a01b039091169063d41ddc9690829063b5af306290602401602060405180830381865afa158015611475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190613975565b6040516001600160e01b031960e084901b1681526004810191909152306024820152604401600060405180830381600087803b1580156114d857600080fd5b505af11580156114ec573d6000803e3d6000fd5b5050600e546006546040516370a0823160e01b815230600482015261157994506001600160a01b0392831693509116906370a0823190602401602060405180830381865afa158015611542573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115669190613975565b6006546001600160a01b03169190613218565b600e60009054906101000a90046001600160a01b03166001600160a01b0316632c932ee76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f09190613ad0565b600780546001600160a01b0319166001600160a01b039290921691821790556040805163c6e1c7c960e01b8152905163c6e1c7c9916004808201926020929091908290030181865afa15801561164a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166e9190613ad0565b600680546001600160a01b0319166001600160a01b03928316179055600e546040805163011fa75760e71b815290519190921691638fd3ab8091600480830192600092919082900301818387803b1580156116c857600080fd5b505af11580156116dc573d6000803e3d6000fd5b505060065460075460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529116925063095ea7b391506044016020604051808303816000875af1158015611736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175a9190613aed565b5060075460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201527f000000000000000000000000fc000000000000000000000000000000000000019091169063095ea7b3906044016020604051808303816000875af11580156117d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f49190613aed565b50600e80546001600160a01b03191690556040516000907f68312d2b0a7e09cd6d48631206e7cc8f0a31d4dea67df512d102a4d57d4a27bf908290a2601480546001600160a01b03191690556040516000907f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd908290a26010805460ff191660019081179091556040519081527f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809060200160405180910390a1600880546001600160a01b03191690556118cb4262093a806139a4565b6009556040516000907fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee908290a2565b60008215610a5a5761190c83611cad565b90508015610a5a5761191e8284612cb0565b600654611936906001600160a01b0316333084612d6f565b61193e610fcd565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101610fbf565b6060600480546109a5906139bc565b600b546001600160a01b0316158015906119b45750600b546001600160a01b031633145b6119eb5760405162461bcd60e51b815260206004820152600860248201526710b82fb7bbb732b960c11b6044820152606401610ab5565b600b8054600a80546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3690600090a2565b600a546001600160a01b03163314611a695760405162461bcd60e51b8152600401610ab590613a38565b601480546001600160a01b0319166001600160a01b0383169081179091556040517f211f06c051495b535b79192c1a4531d819d569657ff4bd16daa8e9e5e6ed2bfd90600090a250565b60003381611ac1828661234c565b905083811015611b215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab5565b611b2e8286868403612762565b506001949350505050565b600033610a76818585612b0c565b600d546001600160a01b031615801590611b6b5750600d546001600160a01b031633145b611baa5760405162461bcd60e51b815260206004820152601060248201526f21705f6d6967726174696f6e526f6c6560801b6044820152606401610ab5565b600d8054600c80546001600160a01b0383166001600160a01b031991821681179092559091169091556040517f1ab379af91e470eda0c8423ad0c73ac7a10b0f2ae848d8ac63533ccf6a158b3a90600090a2565b600a546001600160a01b03163314611c285760405162461bcd60e51b8152600401610ab590613a38565b600954421015611c635760405162461bcd60e51b8152602060048201526006602482015265216f74696d6560d01b6044820152606401610ab5565b600880546001600160a01b0319166001600160a01b0383169081179091556040517fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee90600090a250565b6000610a5a82613248565b60008315610b9f57611cc984610a80565b9050336001600160a01b03831614611ce657611ce6823383612a92565b611cf08282613292565b611cf9846133c4565b600654611d10906001600160a01b03168486613218565b611d18610fcd565b604080518281526020810186905233916001600160a01b0386169183917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db91015b60405180910390a49392505050565b60008315610b9f57336001600160a01b03831614611d8b57611d8b823386612a92565b611d9484610bc8565b905080611dd15760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b6044820152606401610ab5565b611ddb8285613292565b611de4816133c4565b600654611dfb906001600160a01b03168483613218565b611e03610fcd565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db9101611d59565b600a546001600160a01b03163314611e755760405162461bcd60e51b8152600401610ab590613a38565b600b80546001600160a01b0319166001600160a01b0383169081179091556040517f5f4861af37461865f168c6e320428b3141f409a1763bd61b6359d38ad38ae74c90600090a250565b600080600760009054906101000a90046001600160a01b03166001600160a01b031663fbbbf94c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190613b55565b9050600081600001516001600160a01b031663bd9a548b6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa39190613bf5565b925050506000600760009054906101000a90046001600160a01b03166001600160a01b031663f384bd056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ffc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120209190613975565b9050600082620186a0670de0b6b3a764000061203c8a866139f7565b61204691906139f7565b6120509190613a16565b61205a9190613a16565b600754604051634fd422df60e01b81523060048201529192506000916001600160a01b0390911690634fd422df90602401602060405180830381865afa1580156120a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cc9190613975565b600754604051637ec4b57160e01b81526004810183905260016024820181905260448201529192506000916001600160a01b0390911690637ec4b57190606401602060405180830381865afa158015612129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214d9190613975565b9050600080600760009054906101000a90046001600160a01b03166001600160a01b031663cacf3b586040518163ffffffff1660e01b815260040161018060405180830381865afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190613cc7565b815181519298509096506001600160801b03908116955016925050508481116121f45760006121fe565b6121fe8582613a98565b9050600061220c8284613a98565b90506000620186a061221e8f82613a98565b61222890866139f7565b6122329190613a16565b905080821161224257600061224c565b61224c8183613a98565b915081891161225b578861225d565b815b9f9e505050505050505050505050505050565b600061227b60025490565b612283575090565b61228b6108ad565b600254610a5090846139f7565b600c546001600160a01b031633146122c25760405162461bcd60e51b8152600401610ab590613aaf565b600d80546001600160a01b0319166001600160a01b0383169081179091556040517f2c5cb9b16b24763e86019f9d3f1453912c5bb2ed9139f179fedb3511b42ba36390600090a250565b6001600160a01b038116600090815260208190526040812054610a5a90610a28565b6001600160a01b038116600090815260208190526040812054610a5a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610a5a82612270565b6014546001600160a01b03166123c55760405162461bcd60e51b815260206004820152600860248201526710b9bbb0b83832b960c11b6044820152606401610ab5565b600754604051634fd422df60e01b81523060048201526123f7916001600160a01b031690634fd422df90602401610af2565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000fc000000000000000000000000000000000000016001600160a01b0316906370a0823190602401602060405180830381865afa15801561245e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124829190613975565b905060175481116124bf5760405162461bcd60e51b815260206004820152600760248201526610b13ab33332b960c91b6044820152606401610ab5565b6017546124cc9082613a98565b6015549091506001600160a01b0316158015906124eb57506000601654115b156125b6576000620186a06016548361250491906139f7565b61250e9190613a16565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f000000000000000000000000fc00000000000000000000000000000000000001169063a9059cbb906044016020604051808303816000875af1158015612583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a79190613aed565b506125b28183613a98565b9150505b60145460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390527f000000000000000000000000fc000000000000000000000000000000000000019091169063a9059cbb906044016020604051808303816000875af115801561262a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264e9190613aed565b50601460009054906101000a90046001600160a01b03166001600160a01b031663f9fc0d076040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561269f57600080fd5b505af11580156126b3573d6000803e3d6000fd5b505050506126bf610fcd565b50565b600a546001600160a01b03163314806126e557506008546001600160a01b031633145b61271c5760405162461bcd60e51b8152602060048201526008602482015267042dee0bec2eae8d60c31b6044820152606401610ab5565b620186a081106127595760405162461bcd60e51b815260206004820152600860248201526707574696c206761760c41b6044820152606401610ab5565b6126bf81612dda565b6001600160a01b0383166127c45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b6001600160a01b0382166128255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061289160025490565b612899575090565b6128a16108ad565b6002546128ae90846139f7565b6128b89190613a16565b9050816128c460025490565b6128cc6108ad565b6128d690846139f7565b6128e09190613a16565b1015610a6357610a5a8160016139a4565b80156126bf576040516370a0823160e01b81523060048201526001600160a01b037f000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b5581169163ba087652917f000000000000000000000000fc0000000000000000000000000000000000000816906370a0823190602401602060405180830381865afa158015612985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a99190613975565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303816000875af11580156129f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a189190613975565b50600754604051633d417d2d60e01b8152600481018390523060248201526001600160a01b0390911690633d417d2d906044016020604051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613975565b5050565b6000612a9e848461234c565b90506000198114612b065781811015612af95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab5565b612b068484848403612762565b50505050565b6001600160a01b038316612b705760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ab5565b6001600160a01b038216612bd25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ab5565b6001600160a01b03831660009081526020819052604090205481811015612c4a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab5565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3612b06565b6001600160a01b038216612d065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ab5565b8060026000828254612d1891906139a4565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052612b069085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526134e3565b601381905560115460125460408051928352602083019190915281018290527f638b7ccf601c8f4f816a23432b2026b5300c3bbb605a737d3a0dd5e2228b8b2790606001610b75565b8015612f8d57600754604080516302ce728f60e01b815290516000926001600160a01b0316916302ce728f916004808301926060929190829003018187875af1158015612e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e989190613bf5565b505090508015612f8b576007546006546040516370a0823160e01b81523060048201526001600160a01b039283169263e5f13b169286929116906370a0823190602401602060405180830381865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613975565b6040516001600160e01b031960e085901b168152600481019290925260248201523060448201526064016020604051808303816000875af1158015612f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f899190613975565b505b505b6040516370a0823160e01b81523060048201526000907f000000000000000000000000fc000000000000000000000000000000000000016001600160a01b0316906370a0823190602401602060405180830381865afa158015612ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130189190613975565b60405163ef8b30f760e01b8152600481018290529091506000906001600160a01b037f000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b55169063ef8b30f790602401602060405180830381865afa158015613083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130a79190613975565b1115612a8e57604051636e553f6560e01b8152600481018290523060248201527f000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b556001600160a01b031690636e553f65906044016020604051808303816000875af115801561311a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313e9190613975565b505050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561318c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b09190613975565b905080156126bf5760075460405163cadac47960e01b8152600481018390523060248201526001600160a01b039091169063cadac47990604401600060405180830381600087803b15801561320457600080fd5b505af1158015611227573d6000803e3d6000fd5b6040516001600160a01b03831660248201526044810182905261313e90849063a9059cbb60e01b90606401612da3565b60008061325460025490565b1115610a6057600254826132666108ad565b61327091906139f7565b61327a9190613a16565b9050816132856108ad565b6002546128d690846139f7565b6001600160a01b0382166132f25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab5565b6001600160a01b038216600090815260208190526040902054818110156133665760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab5565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561340d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134319190613975565b905080821115612a8e57600754604051634fd422df60e01b815230600482015261346d916001600160a01b031690634fd422df90602401610af2565b6007546001600160a01b031663d41ddc966134888385613a98565b6040516001600160e01b031960e084901b1681526004810191909152306024820152604401600060405180830381600087803b1580156134c757600080fd5b505af11580156134db573d6000803e3d6000fd5b505050505050565b6000613538826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135b89092919063ffffffff16565b90508051600014806135595750808060200190518101906135599190613aed565b61313e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ab5565b60606135c784846000856135cf565b949350505050565b6060824710156136305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ab5565b600080866001600160a01b0316858760405161364c9190613d8d565b60006040518083038185875af1925050503d8060008114613689576040519150601f19603f3d011682016040523d82523d6000602084013e61368e565b606091505b509150915061369f878383876136aa565b979650505050505050565b6060831561371657825161370f576001600160a01b0385163b61370f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ab5565b50816135c7565b6135c7838381511561372b5781518083602001fd5b8060405162461bcd60e51b8152600401610ab59190613771565b60005b83811015613760578181015183820152602001613748565b83811115612b065750506000910152565b6020815260008251806020840152613790816040850160208701613745565b601f01601f19169190910160400192915050565b6000602082840312156137b657600080fd5b5035919050565b6001600160a01b03811681146126bf57600080fd5b600080604083850312156137e557600080fd5b82356137f0816137bd565b946020939093013593505050565b80151581146126bf57600080fd5b60006020828403121561381e57600080fd5b8135610b9f816137fe565b60008060006060848603121561383e57600080fd5b8335613849816137bd565b92506020840135613859816137bd565b929592945050506040919091013590565b60006020828403121561387c57600080fd5b8135610b9f816137bd565b60008060006060848603121561389c57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156138c657600080fd5b8235915060208301356138d8816137bd565b809150509250929050565b6000806000606084860312156138f857600080fd5b83359250602084013561390a816137bd565b9150604084013561391a816137bd565b809150509250925092565b6000806040838503121561393857600080fd5b50508035926020909101359150565b6000806040838503121561395a57600080fd5b8235613965816137bd565b915060208301356138d8816137bd565b60006020828403121561398757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156139b7576139b761398e565b500190565b600181811c908216806139d057607f821691505b602082108114156139f157634e487b7160e01b600052602260045260246000fd5b50919050565b6000816000190483118215151615613a1157613a1161398e565b500290565b600082613a3357634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266042debec2eae8d60cb1b604082015260600190565b60008083128015600160ff1b850184121615613a7757613a7761398e565b6001600160ff1b0384018313811615613a9257613a9261398e565b50500390565b600082821015613aaa57613aaa61398e565b500390565b602080825260079082015266042dabec2eae8d60cb1b604082015260600190565b600060208284031215613ae257600080fd5b8151610b9f816137bd565b600060208284031215613aff57600080fd5b8151610b9f816137fe565b60405160a0810167ffffffffffffffff81118282101715613b3b57634e487b7160e01b600052604160045260246000fd5b60405290565b805163ffffffff81168114610a6357600080fd5b600060a08284031215613b6757600080fd5b60405160a0810181811067ffffffffffffffff82111715613b9857634e487b7160e01b600052604160045260246000fd5b6040528251613ba6816137bd565b8152613bb460208401613b41565b602082015260408301516001600160b81b0381168114613bd357600080fd5b6040820152606083810151908201526080928301519281019290925250919050565b600080600060608486031215613c0a57600080fd5b8351613c15816137fe565b602085015160409095015190969495509392505050565b805167ffffffffffffffff81168114610a6357600080fd5b80516001600160801b0381168114610a6357600080fd5b600060408284031215613c6d57600080fd5b6040516040810181811067ffffffffffffffff82111715613c9e57634e487b7160e01b600052604160045260246000fd5b604052905080613cad83613c44565b8152613cbb60208401613c44565b60208201525092915050565b600080600080600080868803610180811215613ce257600080fd5b87519650602088015195506040880151945060a0605f1982011215613d0657600080fd5b50613d0f613b0a565b613d1b60608901613b41565b8152613d2960808901613b41565b6020820152613d3a60a08901613c2c565b6040820152613d4b60c08901613c2c565b6060820152613d5c60e08901613c2c565b60808201529250613d71886101008901613c5b565b9150613d81886101408901613c5b565b90509295509295509295565b60008251613d9f818460208701613745565b919091019291505056fea2646970667358221220e518665a6260be88fb9f4cc75fe640ba6034d7c5d7c3ba6aa8c6ad6e0b52b1df64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f1e2b576af4c6a7ee966b14c810b772391e921530000000000000000000000003e92765ee2b009b104a8a7baf3759b159c19aba1000000000000000000000000fc00000000000000000000000000000000000001000000000000000000000000fc00000000000000000000000000000000000008000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b55000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e6
-----Decoded View---------------
Arg [0] : _fxb (address): 0xF1e2b576aF4C6a7eE966b14C810b772391e92153
Arg [1] : _lend (address): 0x3e92765eE2B009b104A8A7baf3759B159c19AbA1
Arg [2] : _frax (address): 0xFc00000000000000000000000000000000000001
Arg [3] : _sfrax (address): 0xfc00000000000000000000000000000000000008
Arg [4] : _sfraxVault (address): 0xBFc4D34Db83553725eC6c768da71D2D9c1456B55
Arg [5] : _migratorRole (address): 0xC4EB45d80DC1F079045E75D5d55de8eD1c1090E6
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000f1e2b576af4c6a7ee966b14c810b772391e92153
Arg [1] : 0000000000000000000000003e92765ee2b009b104a8a7baf3759b159c19aba1
Arg [2] : 000000000000000000000000fc00000000000000000000000000000000000001
Arg [3] : 000000000000000000000000fc00000000000000000000000000000000000008
Arg [4] : 000000000000000000000000bfc4d34db83553725ec6c768da71d2d9c1456b55
Arg [5] : 000000000000000000000000c4eb45d80dc1f079045e75d5d55de8ed1c1090e6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$65,535.82
Net Worth in FRAX
66,200.630417
Token Allocations
SFRXUSD
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| FRAXTAL | 100.00% | $1.18 | 55,538.8312 | $65,535.82 |
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.