More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 15633287 | 866 days ago | IN | 0 ETH | 0.00044955 | ||||
Deposit To Pair | 15629119 | 866 days ago | IN | 0 ETH | 0.00143767 | ||||
Deposit To Pair | 15629110 | 866 days ago | IN | 0 ETH | 0.00149484 | ||||
Withdraw Max Fro... | 15629053 | 866 days ago | IN | 0 ETH | 0.00357245 | ||||
Add Collateral T... | 15605437 | 869 days ago | IN | 0 ETH | 0.00010493 | ||||
Deposit To Pair | 15605392 | 869 days ago | IN | 0 ETH | 0.00056129 | ||||
Deposit To Pair | 15605352 | 869 days ago | IN | 0 ETH | 0.0006684 | ||||
Set Pair | 15600637 | 870 days ago | IN | 0 ETH | 0.00053488 | ||||
Set Pair | 15600627 | 870 days ago | IN | 0 ETH | 0.00075053 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FraxlendAMO
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.16; // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // =========================== FraxlendAMO ============================ // ==================================================================== // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Amirnader Aghayeghazvini: https://github.com/amirnader-ghazvini // Reviewer(s) / Contributor(s) // Drake Evans: https://github.com/DrakeEvans // Travis Moore: https://github.com/FortisFortuna // Dennis: https://github.com/denett import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IFraxAMOMinter.sol"; import "./interfaces/IFrax.sol"; import "./interfaces/IFraxlendPair.sol"; import "./interfaces/IFraxlendPairDeployer.sol"; import "./interfaces/IFraxlendPairHelper.sol"; import "./interfaces/IFraxUnifiedFarm_ERC20.sol"; contract FraxlendAMO is Ownable { /* ============================================= STATE VARIABLES ==================================================== */ // Fraxlend pairs with FRAX as asset address[] public pairsArray; mapping(address => bool) public pairsInitialized; mapping(address => uint256) public pairsMaxAllocation; mapping(address => uint256) public pairsMintedFrax; mapping(address => uint256) public pairsProfitTaken; // Fraxlend pairs with FRAX as collateral address[] public borrowPairsArray; mapping(address => bool) public borrowPairsInitialized; mapping(address => uint256) public borrowPairsMaxCollateral; mapping(address => uint256) public borrowPairsMaxLTV; mapping(address => uint256) public borrowPairsCollateralFrax; // Constants (ERC20) IFrax public immutable FRAX; // Addresses COnfig address public operatorAddress; IFraxAMOMinter public amoMinter; IFraxlendPairDeployer public fraxlendPairDeployer; IFraxlendPairHelper public fraxlendPairHelper; // Settings uint256 public constant PRICE_PRECISION = 1e6; /* =============================================== CONSTRUCTOR ====================================================== */ /// @notice constructor /// @param amoMinterAddress_ AMO minter address /// @param operatorAddress_ address of FraxlendPairDeployer /// @param fraxlendPairDeployerAddress_ address of FraxlendPairDeployer /// @param fraxlendPairHelperAddress_ address of FraxlendPairHelper /// @param fraxAddress_ address of FraxlendPairDeployer constructor( address amoMinterAddress_, address operatorAddress_, address fraxlendPairDeployerAddress_, address fraxlendPairHelperAddress_, address fraxAddress_ ) Ownable() { amoMinter = IFraxAMOMinter(amoMinterAddress_); operatorAddress = operatorAddress_; fraxlendPairDeployer = IFraxlendPairDeployer(fraxlendPairDeployerAddress_); fraxlendPairHelper = IFraxlendPairHelper(fraxlendPairHelperAddress_); FRAX = IFrax(fraxAddress_); emit StartAMO(amoMinterAddress_, operatorAddress_, fraxlendPairDeployerAddress_, fraxlendPairHelperAddress_); } /* ================================================ MODIFIERS ======================================================= */ modifier onlyByOwnerOperator() { require(msg.sender == operatorAddress || msg.sender == owner(), "Not owner or operator"); _; } modifier onlyByMinter() { require(msg.sender == address(amoMinter), "Not minter"); _; } modifier approvedPair(address _pair) { require(pairsMaxAllocation[_pair] > 0, "Pair not approved for allocation"); _; } modifier onBudget(address _pair) { _; require( pairsMaxAllocation[_pair] >= pairsMintedFrax[_pair], "Over allocation budget" ); } modifier approvedBorrowPair(address _pair) { require(borrowPairsMaxCollateral[_pair] > 0, "Pair not approved for borrow"); _; } modifier borrowOnBudget(address _pair) { _; require( borrowPairsMaxCollateral[_pair] >= borrowPairsCollateralFrax[_pair], "Over collateral budget" ); } modifier borrowOnLTV(address _pair) { _; IFraxlendPair _fraxlendPair = IFraxlendPair(_pair); uint256 _exchangeRate = fraxlendPairHelper.previewUpdateExchangeRate(_pair); (uint256 _LTV_PRECISION, , , , uint256 _EXCHANGE_PRECISION, , , ) = _fraxlendPair.getConstants(); uint256 _borrowShare = _fraxlendPair.userBorrowShares(address(this)); (uint256 _borrowAmount, , ) = fraxlendPairHelper.toBorrowAmount(_pair, _borrowShare, block.timestamp, block.number, false); uint256 _collateralAmount = _fraxlendPair.userCollateralBalance(address(this)); require(_EXCHANGE_PRECISION > 0, "EXCHANGE_PRECISION is zero."); require(_collateralAmount > 0, "Collateral amount is zero."); uint256 _ltv = (((_borrowAmount * _exchangeRate) / _EXCHANGE_PRECISION) * _LTV_PRECISION) / _collateralAmount; require(_ltv <= borrowPairsMaxLTV[_pair], "Max LTV limit for borrowing"); } /* ================================================== EVENTS ======================================================== */ /// @notice The ```StartAMO``` event fires when the AMO deploy /// @param amoMinterAddress_ AMO minter address /// @param operatorAddress_ address of FraxlendPairDeployer /// @param fraxlendPairDeployerAddress_ address of FraxlendPairDeployer /// @param fraxlendPairHelperAddress_ address of FraxlendPairHelper event StartAMO(address amoMinterAddress_, address operatorAddress_, address fraxlendPairDeployerAddress_, address fraxlendPairHelperAddress_); /// @notice The ```SetOperator``` event fires when the operatorAddress is set /// @param _oldAddress The original address /// @param _newAddress The new address event SetOperator(address _oldAddress, address _newAddress); /// @notice The ```SetAMOMinter``` event fires when the AMO Minter is set /// @param _oldAddress The original address /// @param _newAddress The new address event SetAMOMinter(address _oldAddress, address _newAddress); /// @notice The ```SetFraxlendPairHelper``` event fires when the FraxlendPairHelper is set /// @param _oldAddress The original address /// @param _newAddress The new address event SetFraxlendPairHelper(address _oldAddress, address _newAddress); /// @notice The ```SetFraxlendPairDeployer``` event fires when the FraxlendPairDeployer is set /// @param _oldAddress The original address /// @param _newAddress The new address event SetFraxlendPairDeployer(address _oldAddress, address _newAddress); /// @notice The ```SetPair``` event fires when a pair is added to AMO /// @param _pairAddress The pair address /// @param _maxAllocation Max allowed allocation of AMO into the pair event SetPair(address _pairAddress, uint256 _maxAllocation); /// @notice The ```SetBorrowPair``` event fires when a pair is added to AMO for borrowing /// @param _pairAddress The pair address /// @param _maxCollateralAllocation Max allowed collateral allocation of AMO into the pair /// @param _maxLTV Max allowed LTV for AMO for borrow position event SetBorrowPair(address _pairAddress, uint256 _maxCollateralAllocation, uint256 _maxLTV); /// @notice The ```DepositToPair``` event fires when a deposit happen to a pair /// @param _pairAddress The pair address /// @param _amount Deposited FRAX amount /// @param _shares Deposited shares event DepositToPair(address _pairAddress, uint256 _amount, uint256 _shares); /// @notice The ```WithdrawFromPair``` event fires when a withdrawal happen from a pair /// @param _pairAddress The pair address /// @param _amount Withdrawn FRAX amount /// @param _shares Withdrawn shares event WithdrawFromPair(address _pairAddress, uint256 _amount, uint256 _shares); /// @notice The ```AddCollateral``` event fires when collateral add to a pair /// @param _pairAddress The pair address /// @param _amount Collateral FRAX amount event AddCollateral(address _pairAddress, uint256 _amount); /// @notice The ```RemoveCollateral``` event fires when collateral remove from a pair /// @param _pairAddress The pair address /// @param _amount Collateral FRAX amount event RemoveCollateral(address _pairAddress, uint256 _amount); /// @notice The ```BorrowFromPair``` event fires when a borrow happen from a pair /// @param _pairAddress The pair address /// @param _amount Borrowed asset amount /// @param _shares Borrowed asset shares event BorrowFromPair(address _pairAddress, uint256 _amount, uint256 _shares); /// @notice The ```RepayToPair``` event fires when a repay happen to a pair /// @param _pairAddress The pair address /// @param _amount Repay borrowed asset amount /// @param _shares Repay borrowed asset shares event RepayToPair(address _pairAddress, uint256 _amount, uint256 _shares); /* =================================================== VIEWS ======================================================== */ /// @notice Show allocations of FraxlendAMO in FRAX /// @return _allocations : [Unallocated FRAX, Lent FRAX, Used as Collateral FRAX, Total FRAX] function showAllocations() public view returns (uint256[4] memory _allocations) { // Note: All numbers given are in FRAX unless otherwise indicated // Unallocated FRAX _allocations[0] = FRAX.balanceOf(address(this)); // Allocated FRAX (FRAX in Fraxlend Pairs) address[] memory _pairsArray = pairsArray; for (uint256 i = 0; i < _pairsArray.length; i++) { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairsArray[i]); uint256 _shares = _fraxlendPair.balanceOf(address(this)); (uint256 _amount, , ) = fraxlendPairHelper.toAssetAmount(_pairsArray[i], _shares, block.timestamp, block.number, false); _allocations[1] += _amount; } // FRAX used as collateral in Fraxlend Pairs address[] memory _borrowPairsArray = borrowPairsArray; for (uint256 i = 0; i < _borrowPairsArray.length; i++) { IFraxlendPair _fraxlendPair = IFraxlendPair(_borrowPairsArray[i]); uint256 _amount = _fraxlendPair.userCollateralBalance(address(this)); _allocations[2] += _amount; } // Total FRAX possessed in various forms uint256 sumFrax = _allocations[0] + _allocations[1] + _allocations[2]; _allocations[3] = sumFrax; } /// @notice Show allocations of FraxlendAMO into Fraxlend pair in FRAX /// @param _pairAddress Address of FraxlendPair /// @return _allocations :[Minted FRAX into the pair, Current AMO owned FRAX in pair, AMO FRAX Profit Taken from pair, CR of FRAX in pair, CR Precision] function showPairAccounting(address _pairAddress) public view returns (uint256[5] memory _allocations) { // All numbers given are in FRAX unless otherwise indicated _allocations[0] = pairsMintedFrax[_pairAddress]; IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); uint256 _shares = _fraxlendPair.balanceOf(address(this)); (uint256 _assetAmount,, ) = fraxlendPairHelper.toAssetAmount(_pairAddress, _shares, block.timestamp, block.number, false); _allocations[1] = _assetAmount; _allocations[2] = pairsProfitTaken[_pairAddress]; // Calculate Pair CR (CR related items are not in FRAX) (uint128 _totalAssetAmount, , uint128 _totalBorrowAmount, , uint256 _totalCollateral) = fraxlendPairHelper.getPairAccounting(_pairAddress); uint256 _exchangeRate = fraxlendPairHelper.previewUpdateExchangeRate(_pairAddress); (uint256 _LTV_PRECISION, , , , uint256 _EXCHANGE_PRECISION, , , ) = _fraxlendPair.getConstants(); if (_totalCollateral > 0 && _totalAssetAmount > 0 && _totalBorrowAmount > 0) { uint256 _borrowedLTV = (((_totalBorrowAmount * _exchangeRate) / _EXCHANGE_PRECISION) * _LTV_PRECISION) / _totalCollateral; _allocations[3] = ((((_totalBorrowAmount * _LTV_PRECISION) / _borrowedLTV)) * _LTV_PRECISION) / _totalAssetAmount; } else { _allocations[3] = 0; } _allocations[4] = _LTV_PRECISION; } /// @notice Show borrow pairs accounting in FRAX /// @param _pairAddress Address of borrow FraxlendPair /// @return _allocations :[ Minted FRAX into the pair, Current AMO owned FRAX in pair, Current AMO owned Asset, Current AMO borrowed amount pair ] function showBorrowPairAccounting(address _pairAddress) public view returns (uint256[4] memory _allocations) { // All numbers given are in FRAX unless otherwise stated _allocations[0] = borrowPairsCollateralFrax[_pairAddress]; IFraxlendPair fraxlendPair = IFraxlendPair(_pairAddress); _allocations[1] = fraxlendPair.userCollateralBalance(address(this)); IERC20 _asset = IERC20(fraxlendPair.asset()); // Asset related items are not in FRAX uint256 _totalAssetBalance = _asset.balanceOf(address(this)); _allocations[2] = _totalAssetBalance; uint256 borrowShare = fraxlendPair.userBorrowShares(address(this)); ( uint256 _borrowAmount ,,) = fraxlendPairHelper.toBorrowAmount(_pairAddress, borrowShare, block.timestamp, block.number, false); _allocations[3] = _borrowAmount; } /// @notice total FRAX balance /// @return fraxValE18 FRAX value /// @return collatValE18 FRAX collateral value function dollarBalances() public view returns (uint256 fraxValE18, uint256 collatValE18) { fraxValE18 = showAllocations()[3]; collatValE18 = (fraxValE18 * FRAX.global_collateral_ratio()) / (PRICE_PRECISION); } /// @notice Backwards compatibility /// @return FRAX minted balance of the FraxlendAMO function mintedBalance() public view returns (int256) { return amoMinter.frax_mint_balances(address(this)); } /* =============================================== PAIR FUNCTIONS =================================================== */ /// @notice accrue Interest of a FraxlendPair /// @param _pairAddress Address of FraxlendPair function accrueInterestFraxlendPair(address _pairAddress) public onlyByOwnerOperator { IFraxlendPair(_pairAddress).addInterest(); } /// @notice accrue Interest of all whitelisted FraxlendPairs function accrueInterestAllFraxlendPair() external onlyByOwnerOperator { address[] memory _pairsArray = pairsArray; for (uint256 i = 0; i < _pairsArray.length; i++) { if (pairsInitialized[_pairsArray[i]]) { accrueInterestFraxlendPair(_pairsArray[i]); } } address[] memory _borrowPairsArray = borrowPairsArray; for (uint256 i = 0; i < _borrowPairsArray.length; i++) { if (pairsInitialized[_borrowPairsArray[i]]) { accrueInterestFraxlendPair(_borrowPairsArray[i]); } } } /// @notice Add new FraxlendPair with FRAX as asset address to list /// @param _pairAddress Address of FraxlendPair /// @param _maxAllocation Max Allocation amount for FraxlendPair function setPair( address _pairAddress, uint256 _maxAllocation ) public onlyOwner { require(address(IFraxlendPair(_pairAddress).asset()) == address(FRAX), "Pair asset is not FRAX"); pairsMaxAllocation[_pairAddress] = _maxAllocation; if (pairsInitialized[_pairAddress] == false) { pairsInitialized[_pairAddress] = true; pairsArray.push(_pairAddress); } emit SetPair(_pairAddress, _maxAllocation); } /// @notice Add new FraxlendPair with FRAX as collateral address to list /// @param _pairAddress Address of FraxlendPair /// @param _maxCollateral Max Collateral amount for borrowing from FraxlendPair /// @param _maxLTV Max LTV for borrowing from FraxlendPair function setBorrowPair( address _pairAddress, uint256 _maxCollateral, uint256 _maxLTV ) public onlyOwner { require(address(IFraxlendPair(_pairAddress).collateralContract()) == address(FRAX), "Pair collateral is not FRAX"); borrowPairsMaxCollateral[_pairAddress] = _maxCollateral; borrowPairsMaxLTV[_pairAddress] = _maxLTV; if (borrowPairsInitialized[_pairAddress] == false) { borrowPairsInitialized[_pairAddress] = true; borrowPairsArray.push(_pairAddress); } emit SetBorrowPair(_pairAddress, _maxCollateral, _maxLTV); } /* ============================================= LENDING FUNCTIONS ================================================== */ /// @notice Function to deposit FRAX to specific FraxlendPair /// @param _pairAddress Address of FraxlendPair /// @param _fraxAmount Amount of FRAX to be deposited function depositToPair(address _pairAddress, uint256 _fraxAmount) public approvedPair(_pairAddress) onBudget(_pairAddress) onlyByOwnerOperator { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); FRAX.approve(_pairAddress, _fraxAmount); uint256 _shares = _fraxlendPair.deposit(_fraxAmount, address(this)); pairsMintedFrax[_pairAddress] += _fraxAmount; emit DepositToPair(_pairAddress, _fraxAmount, _shares); } /// @notice Function to withdraw FRAX from specific FraxlendPair /// @param _pairAddress Address of FraxlendPair /// @param _shares shares to be withdrawed function withdrawFromPair(address _pairAddress, uint256 _shares) public onlyByOwnerOperator returns (uint256 _amountWithdrawn) { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); // Calculate current amount balance uint256 _currentBalanceShares = _fraxlendPair.balanceOf(address(this)); (uint256 _currentBalanceAmount,,) = fraxlendPairHelper.toAssetAmount(_pairAddress, _currentBalanceShares, block.timestamp, block.number, false); // Withdraw amount _amountWithdrawn = _fraxlendPair.redeem(_shares, address(this), address(this)); // Effects if (pairsMintedFrax[_pairAddress] < _currentBalanceAmount) { uint256 _profit = _currentBalanceAmount - pairsMintedFrax[_pairAddress]; if (_profit > _amountWithdrawn) { pairsProfitTaken[_pairAddress] = pairsProfitTaken[_pairAddress] + _amountWithdrawn; } else { pairsProfitTaken[_pairAddress] = pairsProfitTaken[_pairAddress] + _profit; pairsMintedFrax[_pairAddress] = pairsMintedFrax[_pairAddress] - (_amountWithdrawn - _profit); } } else { pairsMintedFrax[_pairAddress] = pairsMintedFrax[_pairAddress] - _amountWithdrawn; } emit WithdrawFromPair(_pairAddress, _amountWithdrawn, _shares); } /// @notice Function to withdraw FRAX from all FraxlendPair /// @param _pairAddress Address of FraxlendPair function withdrawMaxFromPair(address _pairAddress) public onlyByOwnerOperator returns (uint256 _amountWithdrawn) { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); uint256 _shares = _fraxlendPair.balanceOf(address(this)); if (_shares == 0) { return 0; } _fraxlendPair.addInterest(); (uint128 _totalAssetAmount, ) = _fraxlendPair.totalAsset(); (uint128 _totalBorrowAmount, ) = _fraxlendPair.totalBorrow(); uint256 _availableAmount = _totalAssetAmount - _totalBorrowAmount; uint256 _availableShares = _fraxlendPair.toAssetShares(_availableAmount,false); if (_shares <= _availableShares) { _amountWithdrawn = withdrawFromPair(_pairAddress, _shares); } else { _amountWithdrawn = withdrawFromPair(_pairAddress, _availableShares); } } /// @notice Function to withdraw FRAX from all FraxlendPair function withdrawMaxFromAllPairs() public onlyByOwnerOperator { address[] memory _pairsArray = pairsArray; for (uint256 i = 0; i < _pairsArray.length; i++) { withdrawMaxFromPair(_pairsArray[i]); } } /* ============================================ BORROWING FUNCTIONS ================================================= */ /// @notice Function to deposit FRAX to specific FraxlendPair as collateral and borrow another token /// @param _pairAddress Address of FraxlendPair /// @param _fraxAmount Amount of FRAX to be deposited as collateral /// @param _borrowAmount Amount of asset to be borrowed function openBorrowPosition( address _pairAddress, uint256 _fraxAmount, uint256 _borrowAmount ) public approvedBorrowPair(_pairAddress) borrowOnBudget(_pairAddress) borrowOnLTV(_pairAddress) onlyByOwnerOperator { IFraxlendPair fraxlendPair = IFraxlendPair(_pairAddress); require(FRAX.balanceOf(address(this)) >= _fraxAmount, "AMO funds too low"); FRAX.approve(_pairAddress, _fraxAmount); uint256 _shares = fraxlendPair.borrowAsset(_borrowAmount, _fraxAmount, address(this)); borrowPairsCollateralFrax[_pairAddress] += _fraxAmount; emit AddCollateral(_pairAddress, _fraxAmount); emit BorrowFromPair(_pairAddress, _borrowAmount, _shares); } /// @notice Function to deposit FRAX to specific FraxlendPair as collateral /// @param _pairAddress Address of FraxlendPair /// @param _fraxAmount Amount of FRAX to be deposited as collateral function addCollateralToPair( address _pairAddress, uint256 _fraxAmount ) public approvedBorrowPair(_pairAddress) borrowOnBudget(_pairAddress) onlyByOwnerOperator { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); require(FRAX.balanceOf(address(this)) >= _fraxAmount, "AMO funds too low"); emit AddCollateral(_pairAddress, _fraxAmount); FRAX.approve(_pairAddress, _fraxAmount); _fraxlendPair.addCollateral(_fraxAmount, address(this)); borrowPairsCollateralFrax[_pairAddress] += _fraxAmount; } /// @notice Function to remove FRAX from specific FraxlendPair collateral /// @param _pairAddress Address of FraxlendPair /// @param _fraxAmount Amount of FRAX to be removed from collateral function removeCollateralFromPair( address _pairAddress, uint256 _fraxAmount ) public approvedBorrowPair(_pairAddress) borrowOnBudget(_pairAddress) borrowOnLTV(_pairAddress) onlyByOwnerOperator { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); require(borrowPairsCollateralFrax[_pairAddress] >= _fraxAmount, "AMO collateral too low"); emit RemoveCollateral(_pairAddress, _fraxAmount); _fraxlendPair.removeCollateral(_fraxAmount, address(this)); borrowPairsCollateralFrax[_pairAddress] -= _fraxAmount; } /// @notice Function to repay loan on FraxlendPair /// @param _pairAddress Address of FraxlendPair /// @param _shares The number of Borrow Shares which will be repaid by the call function repayBorrowPosition( address _pairAddress, uint256 _shares ) public approvedBorrowPair(_pairAddress) borrowOnBudget(_pairAddress) onlyByOwnerOperator { IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); IERC20 _asset = IERC20(_fraxlendPair.asset()); _fraxlendPair.addInterest(); uint256 _amount = _fraxlendPair.toBorrowAmount(_shares, true); _asset.approve(_pairAddress, _amount); uint256 _finalAmount = _fraxlendPair.repayAsset(_shares, address(this)); emit RepayToPair(_pairAddress, _finalAmount, _shares); } /// @notice Function to repay loan on FraxlendPair /// @param _pairAddress Address of FraxlendPair /// @param _swapperAddress The address of the whitelisted swapper to use for token swaps /// @param _collateralToSwap The amount of Collateral Tokens to swap for Asset Tokens /// @param _amountAssetOutMin The minimum amount of Asset Tokens to receive during the swap /// @param _path An array containing the addresses of ERC20 tokens to swap. Adheres to UniV2 style path params. function repayBorrowPositionWithCollateral( address _pairAddress, address _swapperAddress, uint256 _collateralToSwap, uint256 _amountAssetOutMin, address[] calldata _path ) public approvedBorrowPair(_pairAddress) borrowOnBudget(_pairAddress) onlyByOwnerOperator returns (uint256 _amountAssetOut){ IFraxlendPair _fraxlendPair = IFraxlendPair(_pairAddress); _amountAssetOut = _fraxlendPair.repayAssetWithCollateral(_swapperAddress, _collateralToSwap, _amountAssetOutMin, _path); uint256 _sharesOut = _fraxlendPair.toBorrowShares(_amountAssetOut, false); emit RepayToPair(_pairAddress, _amountAssetOut, _sharesOut); } /* ============================================ BURNS AND GIVEBACKS ================================================= */ /// @notice Burn unneeded or excess FRAX. Goes through the minter /// @param _fraxAmount Amount of FRAX to burn function burnFRAX(uint256 _fraxAmount) public onlyOwner { FRAX.approve(address(amoMinter), _fraxAmount); amoMinter.burnFraxFromAMO(_fraxAmount); } /// @notice recoverERC20 recovering ERC20 tokens /// @param _tokenAddress address of ERC20 token /// @param _tokenAmount amount to be withdrawn function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { IERC20 token = IERC20(_tokenAddress); SafeERC20.safeTransfer(token, msg.sender, _tokenAmount); } /* ====================================== RESTRICTED GOVERNANCE FUNCTIONS =========================================== */ /// @notice Change the FRAX Minter /// @param _newAmoMinterAddress FRAX AMO minter function setAMOMinter(address _newAmoMinterAddress) external onlyOwner { emit SetAMOMinter(address(amoMinter), _newAmoMinterAddress); amoMinter = IFraxAMOMinter(_newAmoMinterAddress); } /// @notice Change the FraxlendPairHelper /// @param _newFraxlendPairHelperAddress FraxlendPairHelper Address function setFraxlendPairHelper(address _newFraxlendPairHelperAddress) external onlyOwner { emit SetFraxlendPairHelper(address(fraxlendPairHelper), _newFraxlendPairHelperAddress); fraxlendPairHelper = IFraxlendPairHelper(_newFraxlendPairHelperAddress); } /// @notice Change the FraxlendDeployer /// @param _newFraxlendPairDeployerAddress FRAX AMO minter function setFraxlendPairDeployer(address _newFraxlendPairDeployerAddress) external onlyOwner { emit SetFraxlendPairDeployer(address(fraxlendPairDeployer), _newFraxlendPairDeployerAddress); fraxlendPairDeployer = IFraxlendPairDeployer(_newFraxlendPairDeployerAddress); } /// @notice Change the Operator address /// @param _newOperatorAddress Operator address function setOperatorAddress(address _newOperatorAddress) external onlyOwner { emit SetOperator(operatorAddress, _newOperatorAddress); operatorAddress = _newOperatorAddress; } // Generic proxy function execute( address _to, uint256 _value, bytes calldata _data ) external onlyOwner returns (bool, bytes memory) { (bool success, bytes memory result) = _to.call{ value: _value }(_data); return (success, result); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } 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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.11; // MAY need to be updated interface IFraxAMOMinter { function FRAX() external view returns(address); function FXS() external view returns(address); function acceptOwnership() external; function addAMO(address amo_address, bool sync_too) external; function allAMOAddresses() external view returns(address[] memory); function allAMOsLength() external view returns(uint256); function amos(address) external view returns(bool); function amos_array(uint256) external view returns(address); function burnFraxFromAMO(uint256 frax_amount) external; function burnFxsFromAMO(uint256 fxs_amount) external; function col_idx() external view returns(uint256); function collatDollarBalance() external view returns(uint256); function collatDollarBalanceStored() external view returns(uint256); function collat_borrow_cap() external view returns(int256); function collat_borrowed_balances(address) external view returns(int256); function collat_borrowed_sum() external view returns(int256); function collateral_address() external view returns(address); function collateral_token() external view returns(address); function correction_offsets_amos(address, uint256) external view returns(int256); function custodian_address() external view returns(address); function dollarBalances() external view returns(uint256 frax_val_e18, uint256 collat_val_e18); // function execute(address _to, uint256 _value, bytes _data) external returns(bool, bytes); function fraxDollarBalanceStored() external view returns(uint256); function fraxTrackedAMO(address amo_address) external view returns(int256); function fraxTrackedGlobal() external view returns(int256); function frax_mint_balances(address) external view returns(int256); function frax_mint_cap() external view returns(int256); function frax_mint_sum() external view returns(int256); function fxs_mint_balances(address) external view returns(int256); function fxs_mint_cap() external view returns(int256); function fxs_mint_sum() external view returns(int256); function giveCollatToAMO(address destination_amo, uint256 collat_amount) external; function min_cr() external view returns(uint256); function mintFraxForAMO(address destination_amo, uint256 frax_amount) external; function mintFxsForAMO(address destination_amo, uint256 fxs_amount) external; function missing_decimals() external view returns(uint256); function nominateNewOwner(address _owner) external; function nominatedOwner() external view returns(address); function oldPoolCollectAndGive(address destination_amo) external; function oldPoolRedeem(uint256 frax_amount) external; function old_pool() external view returns(address); function owner() external view returns(address); function pool() external view returns(address); function receiveCollatFromAMO(uint256 usdc_amount) external; function recoverERC20(address tokenAddress, uint256 tokenAmount) external; function removeAMO(address amo_address, bool sync_too) external; function setAMOCorrectionOffsets(address amo_address, int256 frax_e18_correction, int256 collat_e18_correction) external; function setCollatBorrowCap(uint256 _collat_borrow_cap) external; function setCustodian(address _custodian_address) external; function setFraxMintCap(uint256 _frax_mint_cap) external; function setFraxPool(address _pool_address) external; function setFxsMintCap(uint256 _fxs_mint_cap) external; function setMinimumCollateralRatio(uint256 _min_cr) external; function setTimelock(address new_timelock) external; function syncDollarBalances() external; function timelock_address() external view returns(address); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.11; interface IFrax { function COLLATERAL_RATIO_PAUSER() external view returns (bytes32); function DEFAULT_ADMIN_ADDRESS() external view returns (address); function DEFAULT_ADMIN_ROLE() external view returns (bytes32); function addPool(address pool_address ) external; function allowance(address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 amount ) external returns (bool); function balanceOf(address account ) external view returns (uint256); function burn(uint256 amount ) external; function burnFrom(address account, uint256 amount ) external; function collateral_ratio_paused() external view returns (bool); function controller_address() external view returns (address); function creator_address() external view returns (address); function decimals() external view returns (uint8); function decreaseAllowance(address spender, uint256 subtractedValue ) external returns (bool); function eth_usd_consumer_address() external view returns (address); function eth_usd_price() external view returns (uint256); function frax_eth_oracle_address() external view returns (address); function frax_info() external view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256); function frax_pools(address ) external view returns (bool); function frax_pools_array(uint256 ) external view returns (address); function frax_price() external view returns (uint256); function frax_step() external view returns (uint256); function fxs_address() external view returns (address); function fxs_eth_oracle_address() external view returns (address); function fxs_price() external view returns (uint256); function genesis_supply() external view returns (uint256); function getRoleAdmin(bytes32 role ) external view returns (bytes32); function getRoleMember(bytes32 role, uint256 index ) external view returns (address); function getRoleMemberCount(bytes32 role ) external view returns (uint256); function globalCollateralValue() external view returns (uint256); function global_collateral_ratio() external view returns (uint256); function grantRole(bytes32 role, address account ) external; function hasRole(bytes32 role, address account ) external view returns (bool); function increaseAllowance(address spender, uint256 addedValue ) external returns (bool); function last_call_time() external view returns (uint256); function minting_fee() external view returns (uint256); function name() external view returns (string memory); function owner_address() external view returns (address); function pool_burn_from(address b_address, uint256 b_amount ) external; function pool_mint(address m_address, uint256 m_amount ) external; function price_band() external view returns (uint256); function price_target() external view returns (uint256); function redemption_fee() external view returns (uint256); function refreshCollateralRatio() external; function refresh_cooldown() external view returns (uint256); function removePool(address pool_address ) external; function renounceRole(bytes32 role, address account ) external; function revokeRole(bytes32 role, address account ) external; function setController(address _controller_address ) external; function setETHUSDOracle(address _eth_usd_consumer_address ) external; function setFRAXEthOracle(address _frax_oracle_addr, address _weth_address ) external; function setFXSAddress(address _fxs_address ) external; function setFXSEthOracle(address _fxs_oracle_addr, address _weth_address ) external; function setFraxStep(uint256 _new_step ) external; function setMintingFee(uint256 min_fee ) external; function setOwner(address _owner_address ) external; function setPriceBand(uint256 _price_band ) external; function setPriceTarget(uint256 _new_price_target ) external; function setRedemptionFee(uint256 red_fee ) external; function setRefreshCooldown(uint256 _new_cooldown ) external; function setTimelock(address new_timelock ) external; function symbol() external view returns (string memory); function timelock_address() external view returns (address); function toggleCollateralRatio() external; function totalSupply() external view returns (uint256); function transfer(address recipient, uint256 amount ) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount ) external returns (bool); function weth_address() external view returns (address); }
// SPDX-License-Identifier: ISC pragma solidity >=0.6.11; pragma experimental ABIEncoderV2; interface IFraxlendPair { function CIRCUIT_BREAKER_ADDRESS ( ) external view returns ( address ); function COMPTROLLER_ADDRESS ( ) external view returns ( address ); function DEPLOYER_ADDRESS ( ) external view returns ( address ); function FRAXLEND_WHITELIST_ADDRESS ( ) external view returns ( address ); function TIME_LOCK_ADDRESS ( ) external view returns ( address ); function addCollateral ( uint256 _collateralAmount, address _borrower ) external; function addInterest ( ) external returns ( uint256 _interestEarned, uint256 _feesAmount, uint256 _feesShare, uint64 _newRate ); function allowance ( address owner, address spender ) external view returns ( uint256 ); function approve ( address spender, uint256 amount ) external returns ( bool ); function approvedBorrowers ( address ) external view returns ( bool ); function approvedLenders ( address ) external view returns ( bool ); function asset ( ) external view returns ( address ); function balanceOf ( address account ) external view returns ( uint256 ); function borrowAsset ( uint256 _borrowAmount, uint256 _collateralAmount, address _receiver ) external returns ( uint256 _shares ); function borrowerWhitelistActive ( ) external view returns ( bool ); function changeFee ( uint32 _newFee ) external; function cleanLiquidationFee ( ) external view returns ( uint256 ); function collateralContract ( ) external view returns ( address ); function currentRateInfo ( ) external view returns ( uint64 lastBlock, uint64 feeToProtocolRate, uint64 lastTimestamp, uint64 ratePerSec ); function decimals ( ) external pure returns ( uint8 ); function decreaseAllowance ( address spender, uint256 subtractedValue ) external returns ( bool ); function deposit ( uint256 _amount, address _receiver ) external returns ( uint256 _sharesReceived ); function dirtyLiquidationFee ( ) external view returns ( uint256 ); function exchangeRateInfo ( ) external view returns ( uint32 lastTimestamp, uint224 exchangeRate ); function getConstants ( ) external pure returns ( uint256 _LTV_PRECISION, uint256 _LIQ_PRECISION, uint256 _UTIL_PREC, uint256 _FEE_PRECISION, uint256 _EXCHANGE_PRECISION, uint64 _DEFAULT_INT, uint16 _DEFAULT_PROTOCOL_FEE, uint256 _MAX_PROTOCOL_FEE ); function increaseAllowance ( address spender, uint256 addedValue ) external returns ( bool ); function initialize ( string calldata _name, address[] calldata _approvedBorrowers, address[] calldata _approvedLenders, bytes calldata _rateInitCallData ) external; function lenderWhitelistActive ( ) external view returns ( bool ); function leveragedPosition ( address _swapperAddress, uint256 _borrowAmount, uint256 _initialCollateralAmount, uint256 _amountCollateralOutMin, address[] memory _path ) external returns ( uint256 _totalCollateralBalance ); function liquidate ( uint128 _sharesToLiquidate, uint256 _deadline, address _borrower ) external returns ( uint256 _collateralForLiquidator ); function maturityDate ( ) external view returns ( uint256 ); function maxLTV ( ) external view returns ( uint256 ); function name ( ) external view returns ( string memory); function oracleDivide ( ) external view returns ( address ); function oracleMultiply ( ) external view returns ( address ); function oracleNormalization ( ) external view returns ( uint256 ); function owner ( ) external view returns ( address ); function pause ( ) external; function paused ( ) external view returns ( bool ); function penaltyRate ( ) external view returns ( uint256 ); function rateContract ( ) external view returns ( address ); function rateInitCallData ( ) external view returns ( bytes memory ); function redeem ( uint256 _shares, address _receiver, address _owner ) external returns ( uint256 _amountToReturn ); function removeCollateral ( uint256 _collateralAmount, address _receiver ) external; function renounceOwnership ( ) external; function repayAsset ( uint256 _shares, address _borrower ) external returns ( uint256 _amountToRepay ); function repayAssetWithCollateral ( address _swapperAddress, uint256 _collateralToSwap, uint256 _amountAssetOutMin, address[] calldata _path ) external returns ( uint256 _amountAssetOut ); function setApprovedBorrowers ( address[] calldata _borrowers, bool _approval ) external; function setApprovedLenders ( address[] calldata _lenders, bool _approval ) external; function setSwapper ( address _swapper, bool _approval ) external; function setTimeLock ( address _newAddress ) external; function swappers ( address ) external view returns ( bool ); function symbol ( ) external view returns ( string memory ); function toBorrowAmount ( uint256 _shares, bool _roundUp ) external view returns ( uint256 ); function toBorrowShares ( uint256 _amount, bool _roundUp ) external view returns ( uint256 ); function toAssetAmount ( uint256 _shares, bool _roundUp ) external view returns ( uint256 ); function toAssetShares ( uint256 _amount, bool _roundUp ) external view returns ( uint256 ); function totalAsset ( ) external view returns ( uint128 amount, uint128 shares ); function totalBorrow ( ) external view returns ( uint128 amount, uint128 shares ); function totalCollateral ( ) external view returns ( uint256 ); function totalSupply ( ) external view returns ( uint256 ); function transfer ( address to, uint256 amount ) external returns ( bool ); function transferFrom ( address from, address to, uint256 amount ) external returns ( bool ); function transferOwnership ( address newOwner ) external; function unpause ( ) external; function updateExchangeRate ( ) external returns ( uint256 _exchangeRate ); function userBorrowShares ( address ) external view returns ( uint256 ); function userCollateralBalance ( address ) external view returns ( uint256 ); function version ( ) external view returns ( string memory ); function withdrawFees ( uint128 _shares, address _recipient ) external returns ( uint256 _amountToTransfer ); }
// SPDX-License-Identifier: ISC pragma solidity >=0.6.11; pragma experimental ABIEncoderV2; interface IFraxlendPairDeployer { function CIRCUIT_BREAKER_ADDRESS ( ) external view returns ( address ); function COMPTROLLER_ADDRESS ( ) external view returns ( address ); function DEFAULT_LIQ_FEE ( ) external view returns ( uint256 ); function DEFAULT_MAX_LTV ( ) external view returns ( uint256 ); function GLOBAL_MAX_LTV ( ) external view returns ( uint256 ); function TIME_LOCK_ADDRESS ( ) external view returns ( address ); function deploy ( bytes memory _configData ) external returns ( address _pairAddress ); function deployCustom ( string memory _name, bytes memory _configData, uint256 _maxLTV, uint256 _liquidationFee, uint256 _maturityDate, uint256 _penaltyRate, address[] memory _approvedBorrowers, address[] memory _approvedLenders ) external returns ( address _pairAddress ); function deployedPairCustomStatusByAddress ( address ) external view returns ( bool ); function deployedPairsArray ( uint256 ) external view returns ( string memory ); function deployedPairsByName ( string memory ) external view returns ( address ); function deployedPairsBySalt ( bytes32 ) external view returns ( address ); function deployedPairsLength ( ) external view returns ( uint256 ); function getAllPairAddresses ( ) external view returns ( address[] memory ); function getCustomStatuses ( address[] calldata _addresses ) external view returns ( address[] memory _pairCustomStatuses ); function globalPause ( address[] memory _addresses ) external returns ( address[] memory _updatedAddresses ); function owner ( ) external view returns ( address ); function renounceOwnership ( ) external; function setCreationCode ( bytes calldata _creationCode ) external; function transferOwnership ( address newOwner ) external; }
// SPDX-License-Identifier: ISC pragma solidity >=0.6.11; interface IFraxlendPairHelper { struct ImmutablesAddressBool { bool _borrowerWhitelistActive; bool _lenderWhitelistActive; address _assetContract; address _collateralContract; address _oracleMultiply; address _oracleDivide; address _rateContract; address _DEPLOYER_CONTRACT; address _COMPTROLLER_ADDRESS; address _FRAXLEND_WHITELIST; } struct ImmutablesUint256 { uint256 _oracleNormalization; uint256 _maxLTV; uint256 _liquidationFee; uint256 _maturityDate; uint256 _penaltyRate; } function getImmutableAddressBool(address _fraxlendPairAddress) external view returns (ImmutablesAddressBool memory); function getImmutableUint256(address _fraxlendPairAddress) external view returns (ImmutablesUint256 memory); function getPairAccounting(address _fraxlendPairAddress) external view returns ( uint128 _totalAssetAmount, uint128 _totalAssetShares, uint128 _totalBorrowAmount, uint128 _totalBorrowShares, uint256 _totalCollateral ); function getUserSnapshot(address _fraxlendPairAddress, address _address) external view returns ( uint256 _userAssetShares, uint256 _userBorrowShares, uint256 _userCollateralBalance ); function previewLiquidatePure( address _fraxlendPairAddress, uint128 _sharesToLiquidate, address _borrower ) external view returns ( uint128 _amountLiquidatorToRepay, uint256 _collateralForLiquidator, uint128 _sharesToSocialize, uint128 _amountToSocialize ); function previewRateInterest( address _fraxlendPairAddress, uint256 _timestamp, uint256 _blockNumber ) external view returns (uint256 _interestEarned, uint256 _newRate); function previewRateInterestFees( address _fraxlendPairAddress, uint256 _timestamp, uint256 _blockNumber ) external view returns ( uint256 _interestEarned, uint256 _feesAmount, uint256 _feesShare, uint256 _newRate ); function previewTotalAsset( address _fraxlendPairAddress, uint256 _timestamp, uint256 _blockNumber ) external view returns (uint128 _amount, uint128 _shares); function previewTotalBorrow( address _fraxlendPairAddress, uint256 _timestamp, uint256 _blockNumber ) external view returns (uint128 _amount, uint128 _shares); function previewUpdateExchangeRate(address _fraxlendPairAddress) external view returns (uint256 _exchangeRate); function toAssetAmount( address _fraxlendPairAddress, uint256 _shares, uint256 _timestamp, uint256 _blockNumber, bool _roundUp ) external view returns ( uint256 _amount, uint256 _totalAmount, uint256 _totalShares ); function toAssetShares( address _fraxlendPairAddress, uint256 _amount, uint256 _timestamp, uint256 _blockNumber, bool _roundUp ) external view returns ( uint256 _shares, uint256 _totalAmount, uint256 _totalShares ); function toBorrowAmount( address _fraxlendPairAddress, uint256 _shares, uint256 _timestamp, uint256 _blockNumber, bool _roundUp ) external view returns ( uint256 _amount, uint256 _totalAmount, uint256 _totalShares ); function toBorrowShares( address _fraxlendPairAddress, uint256 _amount, uint256 _timestamp, uint256 _blockNumber, bool _roundUp ) external view returns ( uint256 _shares, uint256 _totalAmount, uint256 _totalShares ); function version() external view returns (string memory); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.11; interface IFraxUnifiedFarm_ERC20 { function acceptOwnership ( ) external; function calcCurCombinedWeight ( address account ) external view returns ( uint256 old_combined_weight, uint256 new_vefxs_multiplier, uint256 new_combined_weight ); function calcCurrLockMultiplier ( address account, uint256 stake_idx ) external view returns ( uint256 midpoint_lock_multiplier ); function changeTokenManager ( address reward_token_address, address new_manager_address ) external; function combinedWeightOf ( address account ) external view returns ( uint256 ); function curvePool ( ) external view returns ( address ); function earned ( address account ) external view returns ( uint256[] memory new_earned ); function fraxPerLPStored ( ) external view returns ( uint256 ); function fraxPerLPToken ( ) external view returns ( uint256 ); function getAllRewardTokens ( ) external view returns ( address[] memory ); function getProxyFor ( address addr ) external view returns ( address ); function getReward ( address destination_address ) external returns ( uint256[] memory ); function getReward2 ( address destination_address, bool claim_extra_too ) external returns ( uint256[] memory ); function getRewardExtraLogic ( address destination_address ) external; function getRewardForDuration ( ) external view returns ( uint256[] memory rewards_per_duration_arr ); function isTokenManagerFor ( address caller_addr, address reward_token_addr ) external view returns ( bool ); function lastRewardClaimTime ( address ) external view returns ( uint256 ); function lastUpdateTime ( ) external view returns ( uint256 ); function lockAdditional ( bytes32 kek_id, uint256 addl_liq ) external; function lockLonger ( bytes32 kek_id, uint256 new_ending_ts ) external; function lockMultiplier ( uint256 secs ) external view returns ( uint256 ); function lock_max_multiplier ( ) external view returns ( uint256 ); function lock_time_for_max_multiplier ( ) external view returns ( uint256 ); function lock_time_min ( ) external view returns ( uint256 ); function lockedLiquidityOf ( address account ) external view returns ( uint256 ); function lockedStakes ( address, uint256 ) external view returns ( bytes32 kek_id, uint256 start_timestamp, uint256 liquidity, uint256 ending_timestamp, uint256 lock_multiplier ); function lockedStakesOf ( address account ) external view returns ( bytes[] memory); function lockedStakesOfLength ( address account ) external view returns ( uint256 ); function maxLPForMaxBoost ( address account ) external view returns ( uint256 ); function minVeFXSForMaxBoost ( address account ) external view returns ( uint256 ); function minVeFXSForMaxBoostProxy ( address proxy_address ) external view returns ( uint256 ); function nominateNewOwner ( address _owner ) external; function nominatedOwner ( ) external view returns ( address ); function owner ( ) external view returns ( address ); function periodFinish ( ) external view returns ( uint256 ); function proxyStakedFrax ( address proxy_address ) external view returns ( uint256 ); function proxyToggleStaker ( address staker_address ) external; function proxy_lp_balances ( address ) external view returns ( uint256 ); function recoverERC20 ( address tokenAddress, uint256 tokenAmount ) external; function rewardManagers ( address ) external view returns ( address ); function rewardRates ( uint256 token_idx ) external view returns ( uint256 rwd_rate ); function rewardTokenAddrToIdx ( address ) external view returns ( uint256 ); function rewardsDuration ( ) external view returns ( uint256 ); function rewardsPerToken ( ) external view returns ( uint256[] memory newRewardsPerTokenStored ); function setMiscVariables ( uint256[6] memory _misc_vars ) external; function setPauses ( bool _stakingPaused, bool _withdrawalsPaused, bool _rewardsCollectionPaused ) external; function setRewardVars ( address reward_token_address, uint256 _new_rate, address _gauge_controller_address, address _rewards_distributor_address ) external; function stakeLocked ( uint256 liquidity, uint256 secs ) external returns ( bytes32 ); function stakerSetVeFXSProxy ( address proxy_address ) external; function staker_designated_proxies ( address ) external view returns ( address ); function stakesUnlocked ( ) external view returns ( bool ); function stakingToken ( ) external view returns ( address ); function sync ( ) external; function sync_gauge_weights ( bool force_update ) external; function toggleValidVeFXSProxy ( address _proxy_addr ) external; function totalCombinedWeight ( ) external view returns ( uint256 ); function totalLiquidityLocked ( ) external view returns ( uint256 ); function unlockStakes ( ) external; function updateRewardAndBalance ( address account, bool sync_too ) external; function userStakedFrax ( address account ) external view returns ( uint256 ); function veFXSMultiplier ( address account ) external view returns ( uint256 vefxs_multiplier ); function vefxs_boost_scale_factor ( ) external view returns ( uint256 ); function vefxs_max_multiplier ( ) external view returns ( uint256 ); function vefxs_per_frax_for_max_boost ( ) external view returns ( uint256 ); function withdrawLocked ( bytes32 kek_id, address destination_address ) external returns ( uint256 ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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. */ 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]. */ 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 (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @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 v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "remappings": [ "@chainlink/=node_modules/@chainlink/", "@openzeppelin/=node_modules/@openzeppelin/", "ds-test/=lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "fraxlend-dev/=lib/fraxlend-dev/src/", "hardhat/=node_modules/hardhat/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"amoMinterAddress_","type":"address"},{"internalType":"address","name":"operatorAddress_","type":"address"},{"internalType":"address","name":"fraxlendPairDeployerAddress_","type":"address"},{"internalType":"address","name":"fraxlendPairHelperAddress_","type":"address"},{"internalType":"address","name":"fraxAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AddCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"BorrowFromPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"DepositToPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RemoveCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"RepayToPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_newAddress","type":"address"}],"name":"SetAMOMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxCollateralAllocation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxLTV","type":"uint256"}],"name":"SetBorrowPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_newAddress","type":"address"}],"name":"SetFraxlendPairDeployer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_newAddress","type":"address"}],"name":"SetFraxlendPairHelper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_newAddress","type":"address"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_maxAllocation","type":"uint256"}],"name":"SetPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"amoMinterAddress_","type":"address"},{"indexed":false,"internalType":"address","name":"operatorAddress_","type":"address"},{"indexed":false,"internalType":"address","name":"fraxlendPairDeployerAddress_","type":"address"},{"indexed":false,"internalType":"address","name":"fraxlendPairHelperAddress_","type":"address"}],"name":"StartAMO","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pairAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"WithdrawFromPair","type":"event"},{"inputs":[],"name":"FRAX","outputs":[{"internalType":"contract IFrax","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrueInterestAllFraxlendPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"accrueInterestFraxlendPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_fraxAmount","type":"uint256"}],"name":"addCollateralToPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amoMinter","outputs":[{"internalType":"contract IFraxAMOMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"borrowPairsArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowPairsCollateralFrax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowPairsInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowPairsMaxCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowPairsMaxLTV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fraxAmount","type":"uint256"}],"name":"burnFRAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_fraxAmount","type":"uint256"}],"name":"depositToPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dollarBalances","outputs":[{"internalType":"uint256","name":"fraxValE18","type":"uint256"},{"internalType":"uint256","name":"collatValE18","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fraxlendPairDeployer","outputs":[{"internalType":"contract IFraxlendPairDeployer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fraxlendPairHelper","outputs":[{"internalType":"contract IFraxlendPairHelper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedBalance","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_fraxAmount","type":"uint256"},{"internalType":"uint256","name":"_borrowAmount","type":"uint256"}],"name":"openBorrowPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairsArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairsInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairsMaxAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairsMintedFrax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pairsProfitTaken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_fraxAmount","type":"uint256"}],"name":"removeCollateralFromPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"repayBorrowPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"address","name":"_swapperAddress","type":"address"},{"internalType":"uint256","name":"_collateralToSwap","type":"uint256"},{"internalType":"uint256","name":"_amountAssetOutMin","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"repayBorrowPositionWithCollateral","outputs":[{"internalType":"uint256","name":"_amountAssetOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAmoMinterAddress","type":"address"}],"name":"setAMOMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_maxCollateral","type":"uint256"},{"internalType":"uint256","name":"_maxLTV","type":"uint256"}],"name":"setBorrowPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFraxlendPairDeployerAddress","type":"address"}],"name":"setFraxlendPairDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFraxlendPairHelperAddress","type":"address"}],"name":"setFraxlendPairHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperatorAddress","type":"address"}],"name":"setOperatorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_maxAllocation","type":"uint256"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showAllocations","outputs":[{"internalType":"uint256[4]","name":"_allocations","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"showBorrowPairAccounting","outputs":[{"internalType":"uint256[4]","name":"_allocations","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"showPairAccounting","outputs":[{"internalType":"uint256[5]","name":"_allocations","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdrawFromPair","outputs":[{"internalType":"uint256","name":"_amountWithdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMaxFromAllPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"withdrawMaxFromPair","outputs":[{"internalType":"uint256","name":"_amountWithdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200460438038062004604833981016040819052620000349162000153565b6200003f33620000e6565b600c80546001600160a01b038781166001600160a01b03199283168117909355600b80548883169084168117909155600d80548884169085168117909155600e805488851695168517905591851660809081526040805195865260208601929092529084019190915260608301919091527fab240d0d53474a7b63d5948986c2ee401eb4bcc12ce19a280f68a27cf016b510910160405180910390a15050505050620001c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200014e57600080fd5b919050565b600080600080600060a086880312156200016c57600080fd5b620001778662000136565b9450620001876020870162000136565b9350620001976040870162000136565b9250620001a76060870162000136565b9150620001b76080870162000136565b90509295509295909350565b6080516143df620002256000396000818161052801528181610708015281816107d401528181610e7b015281816110dd015281816111e20152818161137a0152818161173601528181611d7f015281816124300152612a6e01526143df6000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637ff8bb3a11610151578063b61d27f6116100c3578063dfbfa9e311610087578063dfbfa9e3146105ea578063e2274413146105fd578063e3b5cabc14610620578063f12b25ab14610633578063f18d2f9e14610646578063f2fde38b1461065957600080fd5b8063b61d27f61461055d578063b9ed806f1461057e578063c45b473e14610591578063c8dc6387146105a4578063cd2548f6146105d757600080fd5b8063908654e111610115578063908654e1146104ec57806395082d25146104f4578063a4c3e73c146104fe578063ad7b68fe1461051b578063b0e4556f14610523578063b5b937461461054a57600080fd5b80637ff8bb3a1461049a5780638980f11f146104ad5780638a6bd66f146104c05780638b53dcbc146104d35780638da5cb5b146104db57600080fd5b80633fe32037116101ea578063720a6c1b116101ae578063720a6c1b146103ff578063734867f81461041f578063753ca1001461043f578063798fb9001461045f5780637bb68558146104725780637e34026e1461049257600080fd5b80633fe320371461039157806345fa3ceb146103a45780635a28aded146103b7578063682da209146103d7578063715018a6146103f757600080fd5b80631aeb72c21161023c5780631aeb72c21461031257806322bf538c1461032557806323fbd1c7146103385780632542d2361461034b5780632f1d5a601461036b5780633936936f1461037e57600080fd5b806304dc34c8146102795780630cc3ee2b1461028e5780630eae3847146102a15780630f6bd9bd146102b4578063127effb2146102e7575b600080fd5b61028c610287366004613ca0565b61066c565b005b61028c61029c366004613cd5565b610d49565b61028c6102af366004613cf2565b610dba565b6102d46102c2366004613cd5565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b600b546102fa906001600160a01b031681565b6040516001600160a01b0390911681526020016102de565b61028c610320366004613cf2565b61104c565b6102fa610333366004613d1e565b61132e565b61028c610346366004613d1e565b611358565b61035e610359366004613cd5565b611453565b6040516102de9190613d37565b61028c610379366004613cd5565b6116bb565b600d546102fa906001600160a01b031681565b61028c61039f366004613cf2565b61172c565b61028c6103b2366004613cd5565b6118e0565b6102d46103c5366004613cd5565b60036020526000908152604090205481565b6102d46103e5366004613cd5565b60096020526000908152604090205481565b61028c611951565b6102d461040d366004613cd5565b60056020526000908152604090205481565b61043261042d366004613cd5565b611965565b6040516102de9190613d68565b6102d461044d366004613cd5565b60086020526000908152604090205481565b61028c61046d366004613cd5565b611cbf565b6102d4610480366004613cd5565b600a6020526000908152604090205481565b61035e611d62565b6102fa6104a8366004613d1e565b612115565b61028c6104bb366004613cf2565b612125565b600c546102fa906001600160a01b031681565b61028c61213e565b6000546001600160a01b03166102fa565b61028c612333565b6102d4620f424081565b610506612416565b604080519283526020830191909152016102de565b6102d46124ca565b6102fa7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4610558366004613cd5565b61253c565b61057061056b366004613d90565b6127f4565b6040516102de929190613e69565b600e546102fa906001600160a01b031681565b6102d461059f366004613e84565b612870565b6105c76105b2366004613cd5565b60026020526000908152604090205460ff1681565b60405190151581526020016102de565b61028c6105e5366004613ca0565b612a64565b61028c6105f8366004613cf2565b612c2f565b6105c761060b366004613cd5565b60076020526000908152604090205460ff1681565b61028c61062e366004613cf2565b6131a1565b6102d4610641366004613cf2565b6134cc565b61028c610654366004613cd5565b613815565b61028c610667366004613cd5565b613886565b6001600160a01b03831660009081526008602052604090205483906106ac5760405162461bcd60e51b81526004016106a390613f31565b60405180910390fd5b600b54849081906001600160a01b03163314806106d357506000546001600160a01b031633145b6106ef5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b8152306004820152869086907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190613f97565b10156107bd5760405162461bcd60e51b8152602060048201526011602482015270414d4f2066756e647320746f6f206c6f7760781b60448201526064016106a3565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061080b908a908a90600401613fb0565b6020604051808303816000875af115801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e9190613fc9565b506040516372f89d8b60e11b815260048101869052602481018790523060448201526000906001600160a01b0383169063e5f13b16906064016020604051808303816000875af11580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190613f97565b6001600160a01b0389166000908152600a60205260408120805492935089929091906108f7908490614001565b90915550506040517f2ac90482c3b6bea30a2c085cf093016bad7f970d91c5fd233e6b848d3e231dc39061092e908a908a90613fb0565b60405180910390a17fa774255ab8f547727bbdfdfaf852abb35b0c9070298bec49e86de49ace1ca3e58887836040516109699392919061401a565b60405180910390a15050600e546040516317dee7d960e01b81526001600160a01b03808416600483015283926000929116906317dee7d990602401602060405180830381865afa1580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e59190613f97565b9050600080836001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015610a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614053565b5050604051634fd422df60e01b81523060048201529597509095506000946001600160a01b038a169450634fd422df93506024019150610a8a9050565b602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90610b09908a9086904290439088906004016140cb565b606060405180830381865afa158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906140fb565b5050604051635ad7983160e11b81523060048201529091506000906001600160a01b0388169063b5af306290602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba9190613f97565b905060008411610c0c5760405162461bcd60e51b815260206004820152601b60248201527f45584348414e47455f505245434953494f4e206973207a65726f2e000000000060448201526064016106a3565b60008111610c5c5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c61746572616c20616d6f756e74206973207a65726f2e00000000000060448201526064016106a3565b6000818686610c6b8a87614129565b610c759190614140565b610c7f9190614129565b610c899190614140565b6001600160a01b038a16600090815260096020526040902054909150811115610cf45760405162461bcd60e51b815260206004820152601b60248201527f4d6178204c5456206c696d697420666f7220626f72726f77696e67000000000060448201526064016106a3565b5050506001600160a01b0387166000908152600a602090815260408083205460089092529091205410159550610d429450505050505760405162461bcd60e51b81526004016106a390614162565b5050505050565b610d516138ff565b600e54604080516001600160a01b03928316815291831660208301527f2ed193833544ff30670576f492955d7ee6912a3358ddd38dca1ef66bfd1bf4a5910160405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600360205260409020548290610e215760405162461bcd60e51b815260206004820181905260248201527f50616972206e6f7420617070726f76656420666f7220616c6c6f636174696f6e60448201526064016106a3565b600b5483906001600160a01b0316331480610e4657506000546001600160a01b031633145b610e625760405162461bcd60e51b81526004016106a390613f68565b60405163095ea7b360e01b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610eb29084908890600401613fb0565b6020604051808303816000875af1158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef59190613fc9565b50604051636e553f6560e01b8152600481018590523060248201526000906001600160a01b03831690636e553f65906044016020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613f97565b6001600160a01b038716600090815260046020526040812080549293508792909190610f97908490614001565b90915550506040517f5043aa75d1a5c0a4a8be79a77ed7abefc9668fc6907141a1227eabbad1e3a25590610fd09088908890859061401a565b60405180910390a150506001600160a01b03811660009081526004602090815260408083205460039092529091205410156110465760405162461bcd60e51b815260206004820152601660248201527513dd995c88185b1b1bd8d85d1a5bdb88189d5919d95d60521b60448201526064016106a3565b50505050565b6001600160a01b03821660009081526008602052604090205482906110835760405162461bcd60e51b81526004016106a390613f31565b600b5483906001600160a01b03163314806110a857506000546001600160a01b031633145b6110c45760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b8152306004820152849084907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111509190613f97565b10156111925760405162461bcd60e51b8152602060048201526011602482015270414d4f2066756e647320746f6f206c6f7760781b60448201526064016106a3565b7f2ac90482c3b6bea30a2c085cf093016bad7f970d91c5fd233e6b848d3e231dc385856040516111c3929190613fb0565b60405180910390a160405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906112199088908890600401613fb0565b6020604051808303816000875af1158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190613fc9565b5060405163cadac47960e01b8152600481018590523060248201526001600160a01b0382169063cadac47990604401600060405180830381600087803b1580156112a557600080fd5b505af11580156112b9573d6000803e3d6000fd5b505050506001600160a01b0385166000908152600a6020526040812080548692906112e5908490614001565b9091555050506001600160a01b0381166000908152600a602090815260408083205460089092529091205410156110465760405162461bcd60e51b81526004016106a390614162565b6006818154811061133e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6113606138ff565b600c5460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263095ea7b3926113b59291909116908590600401613fb0565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190613fc9565b50600c546040516370c5947560e01b8152600481018390526001600160a01b03909116906370c5947590602401600060405180830381600087803b15801561143f57600080fd5b505af1158015610d42573d6000803e3d6000fd5b61145b613c4f565b6001600160a01b0382166000818152600a60205260409081902054835251635ad7983160e11b815230600482015283919063b5af306290602401602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d69190613f97565b8260016020020181815250506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154691906141a8565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b49190613f97565b9050808460026020020152604051634fd422df60e01b81523060048201526000906001600160a01b03851690634fd422df90602401602060405180830381865afa158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90611668908a9086904290439088906004016140cb565b606060405180830381865afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a991906140fb565b50506060870152509395945050505050565b6116c36138ff565b600b54604080516001600160a01b03928316815291831660208301527f2709918445f306d3e94d280907c62c5d2525ac3192d2e544774c7f181d65af3e910160405180910390a1600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6117346138ff565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c091906141a8565b6001600160a01b03161461180f5760405162461bcd60e51b81526020600482015260166024820152750a0c2d2e440c2e6e6cae840d2e640dcdee8408ca482b60531b60448201526064016106a3565b6001600160a01b0382166000908152600360209081526040808320849055600290915281205460ff16151590036118a3576001600160a01b0382166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191690911790555b7f719a00a2399be9dcbb1b6c0199cc7b8c2dce788158f524349443703ac2ee057c82826040516118d4929190613fb0565b60405180910390a15050565b6118e86138ff565b600c54604080516001600160a01b03928316815291831660208301527ffd06783607ade03b97896d3473828aa2cc1f4abcd794672a6a3431b024cfc209910160405180910390a1600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6119596138ff565b6119636000613959565b565b61196d613c6d565b6001600160a01b0382166000818152600460208190526040808320548552516370a0823160e01b815230918101919091528492906370a0823190602401602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190613f97565b600e54604051632a19f70d60e11b81529192506000916001600160a01b0390911690635433ee1a90611a2990889086904290439088906004016140cb565b606060405180830381865afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906140fb565b505060208086018290526001600160a01b0387811660008181526005909352604080842054818a0152600e5490516317d6dac960e11b815260048101929092529394509192839283929190911690632fadb5929060240160a060405180830381865afa158015611ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0291906141dc565b600e546040516317dee7d960e01b81526001600160a01b038f811660048301529699509397509095506000941692506317dee7d9916024019050602060405180830381865afa158015611b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7d9190613f97565b9050600080886001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be59190614053565b50505094505050509150600084118015611c0857506000866001600160801b0316115b8015611c1d57506000856001600160801b0316115b15611ca4576000848383611c3a876001600160801b038b16614129565b611c449190614140565b611c4e9190614129565b611c589190614140565b9050866001600160801b0316838285896001600160801b0316611c7b9190614129565b611c859190614140565b611c8f9190614129565b611c999190614140565b60608c015250611cac565b600060608b01525b5060808901525095979650505050505050565b600b546001600160a01b0316331480611ce257506000546001600160a01b031633145b611cfe5760405162461bcd60e51b81526004016106a390613f68565b806001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af1158015611d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d42919061423a565b611d6a613c4f565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190613f97565b8152600180546040805160208381028201810190925282815260009390929091830182828015611e4b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e2d575b5050505050905060005b8151811015611fbb576000828281518110611e7257611e72614192565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eeb9190613f97565b600e5485519192506000916001600160a01b0390911690635433ee1a90879087908110611f1a57611f1a614192565b602002602001015184424360006040518663ffffffff1660e01b8152600401611f479594939291906140cb565b606060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8891906140fb565b50506020870180519192508291611fa0908390614001565b905250839250611fb39150829050614279565b915050611e55565b506000600680548060200260200160405190810160405280929190818152602001828054801561201457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ff6575b5050505050905060005b81518110156120e457600082828151811061203b5761203b614192565b6020908102919091010151604051635ad7983160e11b81523060048201529091506000906001600160a01b0383169063b5af306290602401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190613f97565b905080866002602002018181516120cb9190614001565b9052508291506120dc905081614279565b91505061201e565b50604083015160208401518451600092916120fe91614001565b6121089190614001565b6060850152509192915050565b6001818154811061133e57600080fd5b61212d6138ff565b816121398133846139a9565b505050565b600b546001600160a01b031633148061216157506000546001600160a01b031633145b61217d5760405162461bcd60e51b81526004016106a390613f68565b600060018054806020026020016040519081016040528092919081815260200182805480156121d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121b7575b5050505050905060005b815181101561225e57600260008383815181106121fe576121fe614192565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161561224c5761224c82828151811061223f5761223f614192565b6020026020010151611cbf565b8061225681614279565b9150506121df565b50600060068054806020026020016040519081016040528092919081815260200182805480156122b757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612299575b5050505050905060005b815181101561213957600260008383815181106122e0576122e0614192565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156123215761232182828151811061223f5761223f614192565b8061232b81614279565b9150506122c1565b600b546001600160a01b031633148061235657506000546001600160a01b031633145b6123725760405162461bcd60e51b81526004016106a390613f68565b600060018054806020026020016040519081016040528092919081815260200182805480156123ca57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116123ac575b5050505050905060005b8151811015612412576123ff8282815181106123f2576123f2614192565b602002602001015161253c565b508061240a81614279565b9150506123d4565b5050565b600080612421611d62565b600360200201519150620f42407f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632eb9771b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613f97565b6124ba9084614129565b6124c49190614140565b90509091565b600c546040516328255c8960e11b81523060048201526000916001600160a01b03169063504ab91290602401602060405180830381865afa158015612513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125379190613f97565b905090565b600b546000906001600160a01b031633148061256257506000546001600160a01b031633145b61257e5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190613f97565b9050806000036125ff575060009392505050565b816001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af115801561263f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612663919061423a565b505050506000826001600160a01b031663f9557ccb6040518163ffffffff1660e01b81526004016040805180830381865afa1580156126a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ca9190614292565b5090506000836001600160a01b0316638285ef406040518163ffffffff1660e01b81526004016040805180830381865afa15801561270c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127309190614292565b509050600061273f82846142c5565b6040516356968f9760e01b81526001600160801b039190911660048201819052600060248301819052909250906001600160a01b038716906356968f9790604401602060405180830381865afa15801561279d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c19190613f97565b90508085116127db576127d488866134cc565b96506127e8565b6127e588826134cc565b96505b5050505050505b919050565b600060606128006138ff565b600080876001600160a01b031687878760405161281e9291906142ec565b60006040518083038185875af1925050503d806000811461285b576040519150601f19603f3d011682016040523d82523d6000602084013e612860565b606091505b5090999098509650505050505050565b6001600160a01b03861660009081526008602052604081205487906128a75760405162461bcd60e51b81526004016106a390613f31565b600b5488906001600160a01b03163314806128cc57506000546001600160a01b031633145b6128e85760405162461bcd60e51b81526004016106a390613f68565b6040516365114c7f60e11b815289906001600160a01b0382169063ca2298fe9061291e908c908c908c908c908c906004016142fc565b6020604051808303816000875af115801561293d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129619190613f97565b60405163309c295160e21b8152600481018290526000602482018190529195506001600160a01b0383169063c270a54490604401602060405180830381865afa1580156129b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d69190613f97565b90507fed73d0863857050ace457e664f74b42e39a7699bc185a75b5b8cd36e73de092f8b8683604051612a0b9392919061401a565b60405180910390a150506001600160a01b0381166000908152600a60209081526040808320546008909252909120541015612a585760405162461bcd60e51b81526004016106a390614162565b50509695505050505050565b612a6c6138ff565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031663c6e1c7c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af891906141a8565b6001600160a01b031614612b4e5760405162461bcd60e51b815260206004820152601b60248201527f5061697220636f6c6c61746572616c206973206e6f742046524158000000000060448201526064016106a3565b6001600160a01b038316600090815260086020908152604080832085905560098252808320849055600790915281205460ff1615159003612bef576001600160a01b0383166000818152600760205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b03191690911790555b7fa8989a68f659288577688fe206cce166e6dcbeb8e589efd697b7514138d5970b838383604051612c229392919061401a565b60405180910390a1505050565b6001600160a01b0382166000908152600860205260409020548290612c665760405162461bcd60e51b81526004016106a390613f31565b600b54839081906001600160a01b0316331480612c8d57506000546001600160a01b031633145b612ca95760405162461bcd60e51b81526004016106a390613f68565b6001600160a01b0385166000908152600a60205260409020548590851115612d0c5760405162461bcd60e51b8152602060048201526016602482015275414d4f20636f6c6c61746572616c20746f6f206c6f7760501b60448201526064016106a3565b7fe25410a4059619c9594dc6f022fe231b02aaea733f689e7ab0cd21b3d4d0eb548686604051612d3d929190613fb0565b60405180910390a1604051636a0eee4b60e11b8152600481018690523060248201526001600160a01b0382169063d41ddc9690604401600060405180830381600087803b158015612d8d57600080fd5b505af1158015612da1573d6000803e3d6000fd5b505050506001600160a01b0386166000908152600a602052604081208054879290612dcd908490614367565b9091555050600e546040516317dee7d960e01b81526001600160a01b03808516600483015284935060009216906317dee7d990602401602060405180830381865afa158015612e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e449190613f97565b9050600080836001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015612e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eac9190614053565b5050604051634fd422df60e01b81523060048201529597509095506000946001600160a01b038a169450634fd422df93506024019150612ee99050565b602060405180830381865afa158015612f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2a9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90612f68908a9086904290439088906004016140cb565b606060405180830381865afa158015612f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa991906140fb565b5050604051635ad7983160e11b81523060048201529091506000906001600160a01b0388169063b5af306290602401602060405180830381865afa158015612ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130199190613f97565b90506000841161306b5760405162461bcd60e51b815260206004820152601b60248201527f45584348414e47455f505245434953494f4e206973207a65726f2e000000000060448201526064016106a3565b600081116130bb5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c61746572616c20616d6f756e74206973207a65726f2e00000000000060448201526064016106a3565b60008186866130ca8a87614129565b6130d49190614140565b6130de9190614129565b6130e89190614140565b6001600160a01b038a166000908152600960205260409020549091508111156131535760405162461bcd60e51b815260206004820152601b60248201527f4d6178204c5456206c696d697420666f7220626f72726f77696e67000000000060448201526064016106a3565b5050506001600160a01b0387166000908152600a6020908152604080832054600890925290912054101595506110469450505050505760405162461bcd60e51b81526004016106a390614162565b6001600160a01b03821660009081526008602052604090205482906131d85760405162461bcd60e51b81526004016106a390613f31565b600b5483906001600160a01b03163314806131fd57506000546001600160a01b031633145b6132195760405162461bcd60e51b81526004016106a390613f68565b60008490506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328291906141a8565b9050816001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af11580156132c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e8919061423a565b50506040516304a7180f60e51b81526004810188905260016024820152600092506001600160a01b03851691506394e301e090604401602060405180830381865afa15801561333b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335f9190613f97565b60405163095ea7b360e01b81529091506001600160a01b0383169063095ea7b390613390908a908590600401613fb0565b6020604051808303816000875af11580156133af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d39190613fc9565b50604051633d417d2d60e01b8152600481018790523060248201526000906001600160a01b03851690633d417d2d906044016020604051808303816000875af1158015613424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134489190613f97565b90507fed73d0863857050ace457e664f74b42e39a7699bc185a75b5b8cd36e73de092f88828960405161347d9392919061401a565b60405180910390a1505050506001600160a01b0381166000908152600a602090815260408083205460089092529091205410156110465760405162461bcd60e51b81526004016106a390614162565b600b546000906001600160a01b03163314806134f257506000546001600160a01b031633145b61350e5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b815230600482015283906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357b9190613f97565b600e54604051632a19f70d60e11b81529192506000916001600160a01b0390911690635433ee1a906135b990899086904290439088906004016140cb565b606060405180830381865afa1580156135d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fa91906140fb565b5050604051635d043b2960e11b815260048101879052306024820181905260448201529091506001600160a01b0384169063ba087652906064016020604051808303816000875af1158015613653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136779190613f97565b6001600160a01b038716600090815260046020526040902054909450811115613793576001600160a01b0386166000908152600460205260408120546136bd9083614367565b905084811115613709576001600160a01b0387166000908152600560205260409020546136eb908690614001565b6001600160a01b03881660009081526005602052604090205561378d565b6001600160a01b03871660009081526005602052604090205461372d908290614001565b6001600160a01b0388166000908152600560205260409020556137508186614367565b6001600160a01b0388166000908152600460205260409020546137739190614367565b6001600160a01b0388166000908152600460205260409020555b506137d1565b6001600160a01b0386166000908152600460205260409020546137b7908590614367565b6001600160a01b0387166000908152600460205260409020555b7f817d730e57cc50b5afa8d1174def7466f224cf87d8b4f589e64579628da4c0e18685876040516138049392919061401a565b60405180910390a150505092915050565b61381d6138ff565b600d54604080516001600160a01b03928316815291831660208301527f0b6304154e063370d267d3bb5cc55eccfab02a6ed8b981de33ae4871915acf9e910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61388e6138ff565b6001600160a01b0381166138f35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a3565b6138fc81613959565b50565b6000546001600160a01b031633146119635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121398363a9059cbb60e01b84846040516024016139c8929190613fb0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526000613a4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613acc9092919063ffffffff16565b8051909150156121395780806020019051810190613a6d9190613fc9565b6121395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a3565b6060613adb8484600085613ae5565b90505b9392505050565b606082471015613b465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a3565b6001600160a01b0385163b613b9d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a3565b600080866001600160a01b03168587604051613bb9919061437a565b60006040518083038185875af1925050503d8060008114613bf6576040519150601f19603f3d011682016040523d82523d6000602084013e613bfb565b606091505b5091509150613c0b828286613c16565b979650505050505050565b60608315613c25575081613ade565b825115613c355782518084602001fd5b8160405162461bcd60e51b81526004016106a39190614396565b60405180608001604052806004906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b6001600160a01b03811681146138fc57600080fd5b600080600060608486031215613cb557600080fd5b8335613cc081613c8b565b95602085013595506040909401359392505050565b600060208284031215613ce757600080fd5b8135613ade81613c8b565b60008060408385031215613d0557600080fd5b8235613d1081613c8b565b946020939093013593505050565b600060208284031215613d3057600080fd5b5035919050565b60808101818360005b6004811015613d5f578151835260209283019290910190600101613d40565b50505092915050565b60a08101818360005b6005811015613d5f578151835260209283019290910190600101613d71565b60008060008060608587031215613da657600080fd5b8435613db181613c8b565b935060208501359250604085013567ffffffffffffffff80821115613dd557600080fd5b818701915087601f830112613de957600080fd5b813581811115613df857600080fd5b886020828501011115613e0a57600080fd5b95989497505060200194505050565b60005b83811015613e34578181015183820152602001613e1c565b50506000910152565b60008151808452613e55816020860160208601613e19565b601f01601f19169290920160200192915050565b8215158152604060208201526000613adb6040830184613e3d565b60008060008060008060a08789031215613e9d57600080fd5b8635613ea881613c8b565b95506020870135613eb881613c8b565b94506040870135935060608701359250608087013567ffffffffffffffff80821115613ee357600080fd5b818901915089601f830112613ef757600080fd5b813581811115613f0657600080fd5b8a60208260051b8501011115613f1b57600080fd5b6020830194508093505050509295509295509295565b6020808252601c908201527f50616972206e6f7420617070726f76656420666f7220626f72726f7700000000604082015260600190565b6020808252601590820152742737ba1037bbb732b91037b91037b832b930ba37b960591b604082015260600190565b600060208284031215613fa957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215613fdb57600080fd5b81518015158114613ade57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561401457614014613feb565b92915050565b6001600160a01b039390931683526020830191909152604082015260600190565b805167ffffffffffffffff811681146127ef57600080fd5b600080600080600080600080610100898b03121561407057600080fd5b885197506020890151965060408901519550606089015194506080890151935061409c60a08a0161403b565b925060c089015161ffff811681146140b357600080fd5b8092505060e089015190509295985092959890939650565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b60008060006060848603121561411057600080fd5b8351925060208401519150604084015190509250925092565b808202811582820484141761401457614014613feb565b60008261415d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526016908201527513dd995c8818dbdb1b185d195c985b08189d5919d95d60521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141ba57600080fd5b8151613ade81613c8b565b80516001600160801b03811681146127ef57600080fd5b600080600080600060a086880312156141f457600080fd5b6141fd866141c5565b945061420b602087016141c5565b9350614219604087016141c5565b9250614227606087016141c5565b9150608086015190509295509295909350565b6000806000806080858703121561425057600080fd5b84519350602085015192506040850151915061426e6060860161403b565b905092959194509250565b60006001820161428b5761428b613feb565b5060010190565b600080604083850312156142a557600080fd5b6142ae836141c5565b91506142bc602084016141c5565b90509250929050565b6001600160801b038281168282160390808211156142e5576142e5613feb565b5092915050565b8183823760009101908152919050565b6001600160a01b0386811682526020808301879052604083018690526080606084018190528301849052600091859160a08501845b8781101561435857843561434481613c8b565b841682529382019390820190600101614331565b509a9950505050505050505050565b8181038181111561401457614014613feb565b6000825161438c818460208701613e19565b9190910192915050565b602081526000613ade6020830184613e3d56fea2646970667358221220bbafbc2fa1b47e63b6f3030f49f37dbfa4bcfbb60b3d7cdac0c952f5b301063a64736f6c63430008110033000000000000000000000000cf37b62109b537fa0cb9a90af4ca72f6fb85e2410000000000000000000000006e74053a3798e0fc9a9775f7995316b27f21c4d20000000000000000000000005d6e79bcf90140585ce88c7119b7e43caaa6704400000000000000000000000005bb1c15bdb20936aabd31c12130a960d9afe999000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637ff8bb3a11610151578063b61d27f6116100c3578063dfbfa9e311610087578063dfbfa9e3146105ea578063e2274413146105fd578063e3b5cabc14610620578063f12b25ab14610633578063f18d2f9e14610646578063f2fde38b1461065957600080fd5b8063b61d27f61461055d578063b9ed806f1461057e578063c45b473e14610591578063c8dc6387146105a4578063cd2548f6146105d757600080fd5b8063908654e111610115578063908654e1146104ec57806395082d25146104f4578063a4c3e73c146104fe578063ad7b68fe1461051b578063b0e4556f14610523578063b5b937461461054a57600080fd5b80637ff8bb3a1461049a5780638980f11f146104ad5780638a6bd66f146104c05780638b53dcbc146104d35780638da5cb5b146104db57600080fd5b80633fe32037116101ea578063720a6c1b116101ae578063720a6c1b146103ff578063734867f81461041f578063753ca1001461043f578063798fb9001461045f5780637bb68558146104725780637e34026e1461049257600080fd5b80633fe320371461039157806345fa3ceb146103a45780635a28aded146103b7578063682da209146103d7578063715018a6146103f757600080fd5b80631aeb72c21161023c5780631aeb72c21461031257806322bf538c1461032557806323fbd1c7146103385780632542d2361461034b5780632f1d5a601461036b5780633936936f1461037e57600080fd5b806304dc34c8146102795780630cc3ee2b1461028e5780630eae3847146102a15780630f6bd9bd146102b4578063127effb2146102e7575b600080fd5b61028c610287366004613ca0565b61066c565b005b61028c61029c366004613cd5565b610d49565b61028c6102af366004613cf2565b610dba565b6102d46102c2366004613cd5565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b600b546102fa906001600160a01b031681565b6040516001600160a01b0390911681526020016102de565b61028c610320366004613cf2565b61104c565b6102fa610333366004613d1e565b61132e565b61028c610346366004613d1e565b611358565b61035e610359366004613cd5565b611453565b6040516102de9190613d37565b61028c610379366004613cd5565b6116bb565b600d546102fa906001600160a01b031681565b61028c61039f366004613cf2565b61172c565b61028c6103b2366004613cd5565b6118e0565b6102d46103c5366004613cd5565b60036020526000908152604090205481565b6102d46103e5366004613cd5565b60096020526000908152604090205481565b61028c611951565b6102d461040d366004613cd5565b60056020526000908152604090205481565b61043261042d366004613cd5565b611965565b6040516102de9190613d68565b6102d461044d366004613cd5565b60086020526000908152604090205481565b61028c61046d366004613cd5565b611cbf565b6102d4610480366004613cd5565b600a6020526000908152604090205481565b61035e611d62565b6102fa6104a8366004613d1e565b612115565b61028c6104bb366004613cf2565b612125565b600c546102fa906001600160a01b031681565b61028c61213e565b6000546001600160a01b03166102fa565b61028c612333565b6102d4620f424081565b610506612416565b604080519283526020830191909152016102de565b6102d46124ca565b6102fa7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b6102d4610558366004613cd5565b61253c565b61057061056b366004613d90565b6127f4565b6040516102de929190613e69565b600e546102fa906001600160a01b031681565b6102d461059f366004613e84565b612870565b6105c76105b2366004613cd5565b60026020526000908152604090205460ff1681565b60405190151581526020016102de565b61028c6105e5366004613ca0565b612a64565b61028c6105f8366004613cf2565b612c2f565b6105c761060b366004613cd5565b60076020526000908152604090205460ff1681565b61028c61062e366004613cf2565b6131a1565b6102d4610641366004613cf2565b6134cc565b61028c610654366004613cd5565b613815565b61028c610667366004613cd5565b613886565b6001600160a01b03831660009081526008602052604090205483906106ac5760405162461bcd60e51b81526004016106a390613f31565b60405180910390fd5b600b54849081906001600160a01b03163314806106d357506000546001600160a01b031633145b6106ef5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b8152306004820152869086907f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316906370a0823190602401602060405180830381865afa158015610757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190613f97565b10156107bd5760405162461bcd60e51b8152602060048201526011602482015270414d4f2066756e647320746f6f206c6f7760781b60448201526064016106a3565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e169063095ea7b39061080b908a908a90600401613fb0565b6020604051808303816000875af115801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e9190613fc9565b506040516372f89d8b60e11b815260048101869052602481018790523060448201526000906001600160a01b0383169063e5f13b16906064016020604051808303816000875af11580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190613f97565b6001600160a01b0389166000908152600a60205260408120805492935089929091906108f7908490614001565b90915550506040517f2ac90482c3b6bea30a2c085cf093016bad7f970d91c5fd233e6b848d3e231dc39061092e908a908a90613fb0565b60405180910390a17fa774255ab8f547727bbdfdfaf852abb35b0c9070298bec49e86de49ace1ca3e58887836040516109699392919061401a565b60405180910390a15050600e546040516317dee7d960e01b81526001600160a01b03808416600483015283926000929116906317dee7d990602401602060405180830381865afa1580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e59190613f97565b9050600080836001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015610a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614053565b5050604051634fd422df60e01b81523060048201529597509095506000946001600160a01b038a169450634fd422df93506024019150610a8a9050565b602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90610b09908a9086904290439088906004016140cb565b606060405180830381865afa158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906140fb565b5050604051635ad7983160e11b81523060048201529091506000906001600160a01b0388169063b5af306290602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba9190613f97565b905060008411610c0c5760405162461bcd60e51b815260206004820152601b60248201527f45584348414e47455f505245434953494f4e206973207a65726f2e000000000060448201526064016106a3565b60008111610c5c5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c61746572616c20616d6f756e74206973207a65726f2e00000000000060448201526064016106a3565b6000818686610c6b8a87614129565b610c759190614140565b610c7f9190614129565b610c899190614140565b6001600160a01b038a16600090815260096020526040902054909150811115610cf45760405162461bcd60e51b815260206004820152601b60248201527f4d6178204c5456206c696d697420666f7220626f72726f77696e67000000000060448201526064016106a3565b5050506001600160a01b0387166000908152600a602090815260408083205460089092529091205410159550610d429450505050505760405162461bcd60e51b81526004016106a390614162565b5050505050565b610d516138ff565b600e54604080516001600160a01b03928316815291831660208301527f2ed193833544ff30670576f492955d7ee6912a3358ddd38dca1ef66bfd1bf4a5910160405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600360205260409020548290610e215760405162461bcd60e51b815260206004820181905260248201527f50616972206e6f7420617070726f76656420666f7220616c6c6f636174696f6e60448201526064016106a3565b600b5483906001600160a01b0316331480610e4657506000546001600160a01b031633145b610e625760405162461bcd60e51b81526004016106a390613f68565b60405163095ea7b360e01b815284906001600160a01b037f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e169063095ea7b390610eb29084908890600401613fb0565b6020604051808303816000875af1158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef59190613fc9565b50604051636e553f6560e01b8152600481018590523060248201526000906001600160a01b03831690636e553f65906044016020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613f97565b6001600160a01b038716600090815260046020526040812080549293508792909190610f97908490614001565b90915550506040517f5043aa75d1a5c0a4a8be79a77ed7abefc9668fc6907141a1227eabbad1e3a25590610fd09088908890859061401a565b60405180910390a150506001600160a01b03811660009081526004602090815260408083205460039092529091205410156110465760405162461bcd60e51b815260206004820152601660248201527513dd995c88185b1b1bd8d85d1a5bdb88189d5919d95d60521b60448201526064016106a3565b50505050565b6001600160a01b03821660009081526008602052604090205482906110835760405162461bcd60e51b81526004016106a390613f31565b600b5483906001600160a01b03163314806110a857506000546001600160a01b031633145b6110c45760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b8152306004820152849084907f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316906370a0823190602401602060405180830381865afa15801561112c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111509190613f97565b10156111925760405162461bcd60e51b8152602060048201526011602482015270414d4f2066756e647320746f6f206c6f7760781b60448201526064016106a3565b7f2ac90482c3b6bea30a2c085cf093016bad7f970d91c5fd233e6b848d3e231dc385856040516111c3929190613fb0565b60405180910390a160405163095ea7b360e01b81526001600160a01b037f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e169063095ea7b3906112199088908890600401613fb0565b6020604051808303816000875af1158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190613fc9565b5060405163cadac47960e01b8152600481018590523060248201526001600160a01b0382169063cadac47990604401600060405180830381600087803b1580156112a557600080fd5b505af11580156112b9573d6000803e3d6000fd5b505050506001600160a01b0385166000908152600a6020526040812080548692906112e5908490614001565b9091555050506001600160a01b0381166000908152600a602090815260408083205460089092529091205410156110465760405162461bcd60e51b81526004016106a390614162565b6006818154811061133e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6113606138ff565b600c5460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81169263095ea7b3926113b59291909116908590600401613fb0565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190613fc9565b50600c546040516370c5947560e01b8152600481018390526001600160a01b03909116906370c5947590602401600060405180830381600087803b15801561143f57600080fd5b505af1158015610d42573d6000803e3d6000fd5b61145b613c4f565b6001600160a01b0382166000818152600a60205260409081902054835251635ad7983160e11b815230600482015283919063b5af306290602401602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d69190613f97565b8260016020020181815250506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154691906141a8565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b49190613f97565b9050808460026020020152604051634fd422df60e01b81523060048201526000906001600160a01b03851690634fd422df90602401602060405180830381865afa158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90611668908a9086904290439088906004016140cb565b606060405180830381865afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a991906140fb565b50506060870152509395945050505050565b6116c36138ff565b600b54604080516001600160a01b03928316815291831660208301527f2709918445f306d3e94d280907c62c5d2525ac3192d2e544774c7f181d65af3e910160405180910390a1600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6117346138ff565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c091906141a8565b6001600160a01b03161461180f5760405162461bcd60e51b81526020600482015260166024820152750a0c2d2e440c2e6e6cae840d2e640dcdee8408ca482b60531b60448201526064016106a3565b6001600160a01b0382166000908152600360209081526040808320849055600290915281205460ff16151590036118a3576001600160a01b0382166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191690911790555b7f719a00a2399be9dcbb1b6c0199cc7b8c2dce788158f524349443703ac2ee057c82826040516118d4929190613fb0565b60405180910390a15050565b6118e86138ff565b600c54604080516001600160a01b03928316815291831660208301527ffd06783607ade03b97896d3473828aa2cc1f4abcd794672a6a3431b024cfc209910160405180910390a1600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6119596138ff565b6119636000613959565b565b61196d613c6d565b6001600160a01b0382166000818152600460208190526040808320548552516370a0823160e01b815230918101919091528492906370a0823190602401602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190613f97565b600e54604051632a19f70d60e11b81529192506000916001600160a01b0390911690635433ee1a90611a2990889086904290439088906004016140cb565b606060405180830381865afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906140fb565b505060208086018290526001600160a01b0387811660008181526005909352604080842054818a0152600e5490516317d6dac960e11b815260048101929092529394509192839283929190911690632fadb5929060240160a060405180830381865afa158015611ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0291906141dc565b600e546040516317dee7d960e01b81526001600160a01b038f811660048301529699509397509095506000941692506317dee7d9916024019050602060405180830381865afa158015611b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7d9190613f97565b9050600080886001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be59190614053565b50505094505050509150600084118015611c0857506000866001600160801b0316115b8015611c1d57506000856001600160801b0316115b15611ca4576000848383611c3a876001600160801b038b16614129565b611c449190614140565b611c4e9190614129565b611c589190614140565b9050866001600160801b0316838285896001600160801b0316611c7b9190614129565b611c859190614140565b611c8f9190614129565b611c999190614140565b60608c015250611cac565b600060608b01525b5060808901525095979650505050505050565b600b546001600160a01b0316331480611ce257506000546001600160a01b031633145b611cfe5760405162461bcd60e51b81526004016106a390613f68565b806001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af1158015611d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d42919061423a565b611d6a613c4f565b6040516370a0823160e01b81523060048201527f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316906370a0823190602401602060405180830381865afa158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190613f97565b8152600180546040805160208381028201810190925282815260009390929091830182828015611e4b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e2d575b5050505050905060005b8151811015611fbb576000828281518110611e7257611e72614192565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eeb9190613f97565b600e5485519192506000916001600160a01b0390911690635433ee1a90879087908110611f1a57611f1a614192565b602002602001015184424360006040518663ffffffff1660e01b8152600401611f479594939291906140cb565b606060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8891906140fb565b50506020870180519192508291611fa0908390614001565b905250839250611fb39150829050614279565b915050611e55565b506000600680548060200260200160405190810160405280929190818152602001828054801561201457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ff6575b5050505050905060005b81518110156120e457600082828151811061203b5761203b614192565b6020908102919091010151604051635ad7983160e11b81523060048201529091506000906001600160a01b0383169063b5af306290602401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190613f97565b905080866002602002018181516120cb9190614001565b9052508291506120dc905081614279565b91505061201e565b50604083015160208401518451600092916120fe91614001565b6121089190614001565b6060850152509192915050565b6001818154811061133e57600080fd5b61212d6138ff565b816121398133846139a9565b505050565b600b546001600160a01b031633148061216157506000546001600160a01b031633145b61217d5760405162461bcd60e51b81526004016106a390613f68565b600060018054806020026020016040519081016040528092919081815260200182805480156121d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121b7575b5050505050905060005b815181101561225e57600260008383815181106121fe576121fe614192565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161561224c5761224c82828151811061223f5761223f614192565b6020026020010151611cbf565b8061225681614279565b9150506121df565b50600060068054806020026020016040519081016040528092919081815260200182805480156122b757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612299575b5050505050905060005b815181101561213957600260008383815181106122e0576122e0614192565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156123215761232182828151811061223f5761223f614192565b8061232b81614279565b9150506122c1565b600b546001600160a01b031633148061235657506000546001600160a01b031633145b6123725760405162461bcd60e51b81526004016106a390613f68565b600060018054806020026020016040519081016040528092919081815260200182805480156123ca57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116123ac575b5050505050905060005b8151811015612412576123ff8282815181106123f2576123f2614192565b602002602001015161253c565b508061240a81614279565b9150506123d4565b5050565b600080612421611d62565b600360200201519150620f42407f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316632eb9771b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613f97565b6124ba9084614129565b6124c49190614140565b90509091565b600c546040516328255c8960e11b81523060048201526000916001600160a01b03169063504ab91290602401602060405180830381865afa158015612513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125379190613f97565b905090565b600b546000906001600160a01b031633148061256257506000546001600160a01b031633145b61257e5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190613f97565b9050806000036125ff575060009392505050565b816001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af115801561263f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612663919061423a565b505050506000826001600160a01b031663f9557ccb6040518163ffffffff1660e01b81526004016040805180830381865afa1580156126a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ca9190614292565b5090506000836001600160a01b0316638285ef406040518163ffffffff1660e01b81526004016040805180830381865afa15801561270c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127309190614292565b509050600061273f82846142c5565b6040516356968f9760e01b81526001600160801b039190911660048201819052600060248301819052909250906001600160a01b038716906356968f9790604401602060405180830381865afa15801561279d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c19190613f97565b90508085116127db576127d488866134cc565b96506127e8565b6127e588826134cc565b96505b5050505050505b919050565b600060606128006138ff565b600080876001600160a01b031687878760405161281e9291906142ec565b60006040518083038185875af1925050503d806000811461285b576040519150601f19603f3d011682016040523d82523d6000602084013e612860565b606091505b5090999098509650505050505050565b6001600160a01b03861660009081526008602052604081205487906128a75760405162461bcd60e51b81526004016106a390613f31565b600b5488906001600160a01b03163314806128cc57506000546001600160a01b031633145b6128e85760405162461bcd60e51b81526004016106a390613f68565b6040516365114c7f60e11b815289906001600160a01b0382169063ca2298fe9061291e908c908c908c908c908c906004016142fc565b6020604051808303816000875af115801561293d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129619190613f97565b60405163309c295160e21b8152600481018290526000602482018190529195506001600160a01b0383169063c270a54490604401602060405180830381865afa1580156129b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d69190613f97565b90507fed73d0863857050ace457e664f74b42e39a7699bc185a75b5b8cd36e73de092f8b8683604051612a0b9392919061401a565b60405180910390a150506001600160a01b0381166000908152600a60209081526040808320546008909252909120541015612a585760405162461bcd60e51b81526004016106a390614162565b50509695505050505050565b612a6c6138ff565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e6001600160a01b0316836001600160a01b031663c6e1c7c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af891906141a8565b6001600160a01b031614612b4e5760405162461bcd60e51b815260206004820152601b60248201527f5061697220636f6c6c61746572616c206973206e6f742046524158000000000060448201526064016106a3565b6001600160a01b038316600090815260086020908152604080832085905560098252808320849055600790915281205460ff1615159003612bef576001600160a01b0383166000818152600760205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b03191690911790555b7fa8989a68f659288577688fe206cce166e6dcbeb8e589efd697b7514138d5970b838383604051612c229392919061401a565b60405180910390a1505050565b6001600160a01b0382166000908152600860205260409020548290612c665760405162461bcd60e51b81526004016106a390613f31565b600b54839081906001600160a01b0316331480612c8d57506000546001600160a01b031633145b612ca95760405162461bcd60e51b81526004016106a390613f68565b6001600160a01b0385166000908152600a60205260409020548590851115612d0c5760405162461bcd60e51b8152602060048201526016602482015275414d4f20636f6c6c61746572616c20746f6f206c6f7760501b60448201526064016106a3565b7fe25410a4059619c9594dc6f022fe231b02aaea733f689e7ab0cd21b3d4d0eb548686604051612d3d929190613fb0565b60405180910390a1604051636a0eee4b60e11b8152600481018690523060248201526001600160a01b0382169063d41ddc9690604401600060405180830381600087803b158015612d8d57600080fd5b505af1158015612da1573d6000803e3d6000fd5b505050506001600160a01b0386166000908152600a602052604081208054879290612dcd908490614367565b9091555050600e546040516317dee7d960e01b81526001600160a01b03808516600483015284935060009216906317dee7d990602401602060405180830381865afa158015612e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e449190613f97565b9050600080836001600160a01b0316639a295e736040518163ffffffff1660e01b815260040161010060405180830381865afa158015612e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eac9190614053565b5050604051634fd422df60e01b81523060048201529597509095506000946001600160a01b038a169450634fd422df93506024019150612ee99050565b602060405180830381865afa158015612f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2a9190613f97565b600e54604051635ac77e4f60e11b81529192506000916001600160a01b039091169063b58efc9e90612f68908a9086904290439088906004016140cb565b606060405180830381865afa158015612f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa991906140fb565b5050604051635ad7983160e11b81523060048201529091506000906001600160a01b0388169063b5af306290602401602060405180830381865afa158015612ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130199190613f97565b90506000841161306b5760405162461bcd60e51b815260206004820152601b60248201527f45584348414e47455f505245434953494f4e206973207a65726f2e000000000060448201526064016106a3565b600081116130bb5760405162461bcd60e51b815260206004820152601a60248201527f436f6c6c61746572616c20616d6f756e74206973207a65726f2e00000000000060448201526064016106a3565b60008186866130ca8a87614129565b6130d49190614140565b6130de9190614129565b6130e89190614140565b6001600160a01b038a166000908152600960205260409020549091508111156131535760405162461bcd60e51b815260206004820152601b60248201527f4d6178204c5456206c696d697420666f7220626f72726f77696e67000000000060448201526064016106a3565b5050506001600160a01b0387166000908152600a6020908152604080832054600890925290912054101595506110469450505050505760405162461bcd60e51b81526004016106a390614162565b6001600160a01b03821660009081526008602052604090205482906131d85760405162461bcd60e51b81526004016106a390613f31565b600b5483906001600160a01b03163314806131fd57506000546001600160a01b031633145b6132195760405162461bcd60e51b81526004016106a390613f68565b60008490506000816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328291906141a8565b9050816001600160a01b0316630d09365c6040518163ffffffff1660e01b81526004016080604051808303816000875af11580156132c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e8919061423a565b50506040516304a7180f60e51b81526004810188905260016024820152600092506001600160a01b03851691506394e301e090604401602060405180830381865afa15801561333b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335f9190613f97565b60405163095ea7b360e01b81529091506001600160a01b0383169063095ea7b390613390908a908590600401613fb0565b6020604051808303816000875af11580156133af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d39190613fc9565b50604051633d417d2d60e01b8152600481018790523060248201526000906001600160a01b03851690633d417d2d906044016020604051808303816000875af1158015613424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134489190613f97565b90507fed73d0863857050ace457e664f74b42e39a7699bc185a75b5b8cd36e73de092f88828960405161347d9392919061401a565b60405180910390a1505050506001600160a01b0381166000908152600a602090815260408083205460089092529091205410156110465760405162461bcd60e51b81526004016106a390614162565b600b546000906001600160a01b03163314806134f257506000546001600160a01b031633145b61350e5760405162461bcd60e51b81526004016106a390613f68565b6040516370a0823160e01b815230600482015283906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015613557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357b9190613f97565b600e54604051632a19f70d60e11b81529192506000916001600160a01b0390911690635433ee1a906135b990899086904290439088906004016140cb565b606060405180830381865afa1580156135d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fa91906140fb565b5050604051635d043b2960e11b815260048101879052306024820181905260448201529091506001600160a01b0384169063ba087652906064016020604051808303816000875af1158015613653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136779190613f97565b6001600160a01b038716600090815260046020526040902054909450811115613793576001600160a01b0386166000908152600460205260408120546136bd9083614367565b905084811115613709576001600160a01b0387166000908152600560205260409020546136eb908690614001565b6001600160a01b03881660009081526005602052604090205561378d565b6001600160a01b03871660009081526005602052604090205461372d908290614001565b6001600160a01b0388166000908152600560205260409020556137508186614367565b6001600160a01b0388166000908152600460205260409020546137739190614367565b6001600160a01b0388166000908152600460205260409020555b506137d1565b6001600160a01b0386166000908152600460205260409020546137b7908590614367565b6001600160a01b0387166000908152600460205260409020555b7f817d730e57cc50b5afa8d1174def7466f224cf87d8b4f589e64579628da4c0e18685876040516138049392919061401a565b60405180910390a150505092915050565b61381d6138ff565b600d54604080516001600160a01b03928316815291831660208301527f0b6304154e063370d267d3bb5cc55eccfab02a6ed8b981de33ae4871915acf9e910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61388e6138ff565b6001600160a01b0381166138f35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a3565b6138fc81613959565b50565b6000546001600160a01b031633146119635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121398363a9059cbb60e01b84846040516024016139c8929190613fb0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526000613a4f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613acc9092919063ffffffff16565b8051909150156121395780806020019051810190613a6d9190613fc9565b6121395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a3565b6060613adb8484600085613ae5565b90505b9392505050565b606082471015613b465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a3565b6001600160a01b0385163b613b9d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a3565b600080866001600160a01b03168587604051613bb9919061437a565b60006040518083038185875af1925050503d8060008114613bf6576040519150601f19603f3d011682016040523d82523d6000602084013e613bfb565b606091505b5091509150613c0b828286613c16565b979650505050505050565b60608315613c25575081613ade565b825115613c355782518084602001fd5b8160405162461bcd60e51b81526004016106a39190614396565b60405180608001604052806004906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b6001600160a01b03811681146138fc57600080fd5b600080600060608486031215613cb557600080fd5b8335613cc081613c8b565b95602085013595506040909401359392505050565b600060208284031215613ce757600080fd5b8135613ade81613c8b565b60008060408385031215613d0557600080fd5b8235613d1081613c8b565b946020939093013593505050565b600060208284031215613d3057600080fd5b5035919050565b60808101818360005b6004811015613d5f578151835260209283019290910190600101613d40565b50505092915050565b60a08101818360005b6005811015613d5f578151835260209283019290910190600101613d71565b60008060008060608587031215613da657600080fd5b8435613db181613c8b565b935060208501359250604085013567ffffffffffffffff80821115613dd557600080fd5b818701915087601f830112613de957600080fd5b813581811115613df857600080fd5b886020828501011115613e0a57600080fd5b95989497505060200194505050565b60005b83811015613e34578181015183820152602001613e1c565b50506000910152565b60008151808452613e55816020860160208601613e19565b601f01601f19169290920160200192915050565b8215158152604060208201526000613adb6040830184613e3d565b60008060008060008060a08789031215613e9d57600080fd5b8635613ea881613c8b565b95506020870135613eb881613c8b565b94506040870135935060608701359250608087013567ffffffffffffffff80821115613ee357600080fd5b818901915089601f830112613ef757600080fd5b813581811115613f0657600080fd5b8a60208260051b8501011115613f1b57600080fd5b6020830194508093505050509295509295509295565b6020808252601c908201527f50616972206e6f7420617070726f76656420666f7220626f72726f7700000000604082015260600190565b6020808252601590820152742737ba1037bbb732b91037b91037b832b930ba37b960591b604082015260600190565b600060208284031215613fa957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215613fdb57600080fd5b81518015158114613ade57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561401457614014613feb565b92915050565b6001600160a01b039390931683526020830191909152604082015260600190565b805167ffffffffffffffff811681146127ef57600080fd5b600080600080600080600080610100898b03121561407057600080fd5b885197506020890151965060408901519550606089015194506080890151935061409c60a08a0161403b565b925060c089015161ffff811681146140b357600080fd5b8092505060e089015190509295985092959890939650565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b60008060006060848603121561411057600080fd5b8351925060208401519150604084015190509250925092565b808202811582820484141761401457614014613feb565b60008261415d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526016908201527513dd995c8818dbdb1b185d195c985b08189d5919d95d60521b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141ba57600080fd5b8151613ade81613c8b565b80516001600160801b03811681146127ef57600080fd5b600080600080600060a086880312156141f457600080fd5b6141fd866141c5565b945061420b602087016141c5565b9350614219604087016141c5565b9250614227606087016141c5565b9150608086015190509295509295909350565b6000806000806080858703121561425057600080fd5b84519350602085015192506040850151915061426e6060860161403b565b905092959194509250565b60006001820161428b5761428b613feb565b5060010190565b600080604083850312156142a557600080fd5b6142ae836141c5565b91506142bc602084016141c5565b90509250929050565b6001600160801b038281168282160390808211156142e5576142e5613feb565b5092915050565b8183823760009101908152919050565b6001600160a01b0386811682526020808301879052604083018690526080606084018190528301849052600091859160a08501845b8781101561435857843561434481613c8b565b841682529382019390820190600101614331565b509a9950505050505050505050565b8181038181111561401457614014613feb565b6000825161438c818460208701613e19565b9190910192915050565b602081526000613ade6020830184613e3d56fea2646970667358221220bbafbc2fa1b47e63b6f3030f49f37dbfa4bcfbb60b3d7cdac0c952f5b301063a64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cf37b62109b537fa0cb9a90af4ca72f6fb85e2410000000000000000000000006e74053a3798e0fc9a9775f7995316b27f21c4d20000000000000000000000005d6e79bcf90140585ce88c7119b7e43caaa6704400000000000000000000000005bb1c15bdb20936aabd31c12130a960d9afe999000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
-----Decoded View---------------
Arg [0] : amoMinterAddress_ (address): 0xcf37B62109b537fa0Cb9A90Af4CA72f6fb85E241
Arg [1] : operatorAddress_ (address): 0x6e74053a3798e0fC9a9775F7995316b27f21c4D2
Arg [2] : fraxlendPairDeployerAddress_ (address): 0x5d6e79Bcf90140585CE88c7119b7E43CAaA67044
Arg [3] : fraxlendPairHelperAddress_ (address): 0x05BB1C15BDb20936AABd31c12130A960d9AFe999
Arg [4] : fraxAddress_ (address): 0x853d955aCEf822Db058eb8505911ED77F175b99e
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf37b62109b537fa0cb9a90af4ca72f6fb85e241
Arg [1] : 0000000000000000000000006e74053a3798e0fc9a9775f7995316b27f21c4d2
Arg [2] : 0000000000000000000000005d6e79bcf90140585ce88c7119b7e43caaa67044
Arg [3] : 00000000000000000000000005bb1c15bdb20936aabd31c12130a960d9afe999
Arg [4] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 99.93% | $0.996654 | 19,584,874.1007 | $19,519,343.11 | |
ETH | 0.05% | $96,896 | 0.1 | $9,689.6 | |
ETH | 0.01% | $2,680.24 | 1 | $2,680.24 | |
BSC | <0.01% | $1.65 | 815.2932 | $1,345.23 | |
BSC | <0.01% | $0.998077 | 1 | $0.998 | |
OP | <0.01% | $1.65 | 324.4693 | $535.37 | |
OP | <0.01% | $2,655.68 | 0.001 | $2.66 | |
POL | <0.01% | $1.65 | 192.2911 | $317.28 | |
POL | <0.01% | $0.998077 | 1 | $0.998 |
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.