More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,265 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Adjust Trove | 131863443 | 4 days ago | IN | 0 ETH | 0.000000582427 | ||||
Close Trove | 131858759 | 5 days ago | IN | 0 ETH | 0.00000041345 | ||||
Claim Collateral | 131858687 | 5 days ago | IN | 0 ETH | 0.000000092059 | ||||
Adjust Trove | 131742580 | 7 days ago | IN | 0 ETH | 0.000000050692 | ||||
Adjust Trove | 131682653 | 9 days ago | IN | 0 ETH | 0.00000053809 | ||||
Adjust Trove | 131555825 | 12 days ago | IN | 0 ETH | 0.000000448428 | ||||
Adjust Trove | 131555777 | 12 days ago | IN | 0 ETH | 0.000000779164 | ||||
Adjust Trove | 131555633 | 12 days ago | IN | 0 ETH | 0.000001131754 | ||||
Adjust Trove | 131499167 | 13 days ago | IN | 0 ETH | 0.00000047781 | ||||
Adjust Trove | 131499051 | 13 days ago | IN | 0 ETH | 0.000000442591 | ||||
Adjust Trove | 131490314 | 13 days ago | IN | 0 ETH | 0.000000531361 | ||||
Adjust Trove | 131453572 | 14 days ago | IN | 0 ETH | 0.000000091204 | ||||
Adjust Trove | 131437449 | 14 days ago | IN | 0 ETH | 0.000000582663 | ||||
Adjust Trove | 131403640 | 15 days ago | IN | 0 ETH | 0.000000449476 | ||||
Adjust Trove | 131389421 | 15 days ago | IN | 0 ETH | 0.000000066904 | ||||
Adjust Trove | 131270826 | 18 days ago | IN | 0 ETH | 0.000000530147 | ||||
Adjust Trove | 131215117 | 19 days ago | IN | 0 ETH | 0.0000025089 | ||||
Close Trove | 131188645 | 20 days ago | IN | 0 ETH | 0.000000866537 | ||||
Adjust Trove | 131165363 | 21 days ago | IN | 0 ETH | 0.000000594244 | ||||
Adjust Trove | 131111617 | 22 days ago | IN | 0 ETH | 0.000000581447 | ||||
Adjust Trove | 130908176 | 27 days ago | IN | 0 ETH | 0.000001702728 | ||||
Adjust Trove | 130906938 | 27 days ago | IN | 0 ETH | 0.000002433324 | ||||
Adjust Trove | 130906840 | 27 days ago | IN | 0 ETH | 0.00000222795 | ||||
Adjust Trove | 130897090 | 27 days ago | IN | 0 ETH | 0.000002616607 | ||||
Adjust Trove | 130879160 | 27 days ago | IN | 0 ETH | 0.000001095413 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BorrowerOperations
Compiler Version
v0.6.11+commit.5ef660b1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; pragma experimental ABIEncoderV2; import "./Interfaces/IBorrowerOperations.sol"; import "./Interfaces/ICollateralConfig.sol"; import "./Interfaces/ITroveManager.sol"; import "./Interfaces/ILUSDToken.sol"; import "./Interfaces/ICollSurplusPool.sol"; import "./Interfaces/ISortedTroves.sol"; import "./Interfaces/ILQTYStaking.sol"; import "./Dependencies/LiquityBase.sol"; import "./Dependencies/Ownable.sol"; import "./Dependencies/CheckContract.sol"; import "./Dependencies/console.sol"; import "./Dependencies/SafeERC20.sol"; contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOperations { using SafeERC20 for IERC20; string constant public NAME = "BorrowerOperations"; bool public initialized = false; mapping(address => bool) public exemptFromFee; // --- Connected contract declarations --- ICollateralConfig public collateralConfig; ITroveManager public troveManager; address gasPoolAddress; ICollSurplusPool collSurplusPool; ILQTYStaking public lqtyStaking; address public lqtyStakingAddress; ILUSDToken public lusdToken; // A doubly linked list of Troves, sorted by their collateral ratios ISortedTroves public sortedTroves; address public leveragerAddress; /* --- Variable container structs --- Used to hold, return and assign variables inside a function, in order to avoid the error: "CompilerError: Stack too deep". */ struct LocalVariables_adjustTrove { uint256 collCCR; uint256 collMCR; uint256 collDecimals; uint price; uint collChange; uint netDebtChange; bool isCollIncrease; uint debt; uint coll; uint oldICR; uint newICR; uint newTCR; uint LUSDFee; uint newDebt; uint newColl; uint stake; address newUpperHint; address newLowerHint; } struct LocalVariables_openTrove { uint256 collCCR; uint256 collMCR; uint256 collDecimals; uint price; uint LUSDFee; uint netDebt; uint compositeDebt; uint ICR; uint NICR; uint stake; uint arrayIndex; address newUpperHint; address newLowerHint; } struct ContractsCache { ITroveManager troveManager; IActivePool activePool; ILUSDToken lusdToken; } enum BorrowerOperation { openTrove, closeTrove, adjustTrove } event CollateralConfigAddressChanged(address _newCollateralConfigAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LUSDTokenAddressChanged(address _lusdTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event LeveragerAddressChanged(address _leverager); event SetFeeExemption(address _borrower, bool _isExempt); event TroveCreated(address indexed _borrower, address _collateral, uint arrayIndex); event TroveUpdated(address indexed _borrower, address _collateral, uint _debt, uint _coll, uint stake, BorrowerOperation operation); event LUSDBorrowingFeePaid(address indexed _borrower, address _collateral, uint _LUSDFee); // --- Dependency setters --- function setAddresses( address _collateralConfigAddress, address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _lusdTokenAddress, address _lqtyStakingAddress, address _leveragerAddress ) external override onlyOwner { require(!initialized, "Can only initialize once"); // This makes impossible to open a trove with zero withdrawn LUSD assert(MIN_NET_DEBT > 0); checkContract(_collateralConfigAddress); checkContract(_troveManagerAddress); checkContract(_activePoolAddress); checkContract(_defaultPoolAddress); checkContract(_gasPoolAddress); checkContract(_collSurplusPoolAddress); checkContract(_priceFeedAddress); checkContract(_sortedTrovesAddress); checkContract(_lusdTokenAddress); checkContract(_lqtyStakingAddress); checkContract(_leveragerAddress); collateralConfig = ICollateralConfig(_collateralConfigAddress); troveManager = ITroveManager(_troveManagerAddress); activePool = IActivePool(_activePoolAddress); defaultPool = IDefaultPool(_defaultPoolAddress); gasPoolAddress = _gasPoolAddress; collSurplusPool = ICollSurplusPool(_collSurplusPoolAddress); priceFeed = IPriceFeed(_priceFeedAddress); sortedTroves = ISortedTroves(_sortedTrovesAddress); lusdToken = ILUSDToken(_lusdTokenAddress); lqtyStakingAddress = _lqtyStakingAddress; lqtyStaking = ILQTYStaking(_lqtyStakingAddress); leveragerAddress = _leveragerAddress; emit CollateralConfigAddressChanged(_collateralConfigAddress); emit TroveManagerAddressChanged(_troveManagerAddress); emit ActivePoolAddressChanged(_activePoolAddress); emit DefaultPoolAddressChanged(_defaultPoolAddress); emit GasPoolAddressChanged(_gasPoolAddress); emit CollSurplusPoolAddressChanged(_collSurplusPoolAddress); emit PriceFeedAddressChanged(_priceFeedAddress); emit SortedTrovesAddressChanged(_sortedTrovesAddress); emit LUSDTokenAddressChanged(_lusdTokenAddress); emit LQTYStakingAddressChanged(_lqtyStakingAddress); emit LeveragerAddressChanged(_leveragerAddress); initialized = true; } function setLeveragerAddress(address _leveragerAddress) external onlyOwner { checkContract(_leveragerAddress); leveragerAddress = _leveragerAddress; emit LeveragerAddressChanged(_leveragerAddress); } function setExemptFromFee(address _borrower, bool _isExempt) external onlyOwner { exemptFromFee[_borrower] = _isExempt; emit SetFeeExemption(_borrower, _isExempt); } // --- Borrower Trove Operations --- function openTroveFor(address _borrower, address _collateral, uint _collAmount, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external override returns (address, address) { _requireCallerIsLeverager(); return _openTrove(_borrower, _collateral, _collAmount, _maxFeePercentage, _LUSDAmount, _upperHint, _lowerHint); } function openTrove(address _collateral, uint _collAmount, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _openTrove(msg.sender, _collateral, _collAmount, _maxFeePercentage, _LUSDAmount, _upperHint, _lowerHint); } function _openTrove(address _borrower, address _collateral, uint _collAmount, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) internal returns (address, address) { _requireValidCollateralAddress(_collateral); _requireSufficientCollateralBalanceAndAllowance(msg.sender, _collateral, _collAmount); ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, lusdToken); LocalVariables_openTrove memory vars; vars.collCCR = collateralConfig.getCollateralCCR(_collateral); vars.collMCR = collateralConfig.getCollateralMCR(_collateral); vars.collDecimals = collateralConfig.getCollateralDecimals(_collateral); vars.price = priceFeed.fetchPrice(_collateral); bool isRecoveryMode = _checkRecoveryMode(_collateral, vars.price, vars.collCCR, vars.collDecimals); _requireValidMaxFeePercentage(_maxFeePercentage, isRecoveryMode, _borrower); _requireTroveisNotActive(contractsCache.troveManager, _borrower, _collateral); vars.netDebt = _LUSDAmount; if (!isRecoveryMode && !exemptFromFee[_borrower]) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.lusdToken, _LUSDAmount, _maxFeePercentage); vars.netDebt = vars.netDebt.add(vars.LUSDFee); } _requireAtLeastMinNetDebt(vars.netDebt); // ICR is based on the composite debt, i.e. the requested LUSD amount + LUSD borrowing fee + LUSD gas comp. vars.compositeDebt = _getCompositeDebt(vars.netDebt); assert(vars.compositeDebt > 0); vars.ICR = LiquityMath._computeCR(_collAmount, vars.compositeDebt, vars.price, vars.collDecimals); vars.NICR = LiquityMath._computeNominalCR(_collAmount, vars.compositeDebt, vars.collDecimals); if (isRecoveryMode) { _requireICRisAboveCCR(vars.ICR, vars.collCCR); } else { _requireICRisAboveMCR(vars.ICR, vars.collMCR); uint newTCR = _getNewTCRFromTroveChange( _collateral, _collAmount, true, // coll increase vars.compositeDebt, true, // debt increase vars.price, vars.collDecimals ); _requireNewTCRisAboveCCR(newTCR, vars.collCCR); } // Set the trove struct's properties contractsCache.troveManager.setTroveStatus(_borrower, _collateral, uint(TroveStatus.active)); contractsCache.troveManager.increaseTroveColl(_borrower, _collateral, _collAmount); contractsCache.troveManager.increaseTroveDebt(_borrower, _collateral, vars.compositeDebt); contractsCache.troveManager.updateTroveRewardSnapshots(_borrower, _collateral); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(_borrower, _collateral); (vars.newUpperHint, vars.newLowerHint) = sortedTroves.insert(_collateral, _borrower, vars.NICR, _upperHint, _lowerHint); vars.arrayIndex = contractsCache.troveManager.addTroveOwnerToArray(_borrower, _collateral); emit TroveCreated(_borrower, _collateral, vars.arrayIndex); // Pull collateral, move it to the Active Pool, and mint the LUSDAmount to the borrower IERC20(_collateral).safeTransferFrom(msg.sender, address(this), _collAmount); _activePoolAddColl(contractsCache.activePool, _collateral, _collAmount); _withdrawLUSD(contractsCache.activePool, contractsCache.lusdToken, _collateral, msg.sender, _LUSDAmount, vars.netDebt); // Move the LUSD gas compensation to the Gas Pool _withdrawLUSD(contractsCache.activePool, contractsCache.lusdToken, _collateral, gasPoolAddress, LUSD_GAS_COMPENSATION, LUSD_GAS_COMPENSATION); emit TroveUpdated(_borrower, _collateral, vars.compositeDebt, _collAmount, vars.stake, BorrowerOperation.openTrove); emit LUSDBorrowingFeePaid(_borrower, _collateral, vars.LUSDFee); return (vars.newUpperHint, vars.newLowerHint); } // Send more collateral to an existing trove function addColl(address _collateral, uint _collAmount, address _upperHint, address _lowerHint) external override { _requireSufficientCollateralBalanceAndAllowance(msg.sender, _collateral, _collAmount); _adjustTrove(Params_adjustTroveFor({ _borrower: msg.sender, _collateral: _collateral, _maxFeePercentage: 0, _collTopUp: _collAmount, _collWithdrawal: 0, _LUSDChange: 0, _isDebtIncrease: false, _upperHint: _upperHint, _lowerHint: _lowerHint })); } // Withdraw collateral from a trove function withdrawColl(address _collateral, uint _collWithdrawal, address _upperHint, address _lowerHint) external override { _adjustTrove(Params_adjustTroveFor({ _borrower: msg.sender, _collateral: _collateral, _maxFeePercentage: 0, _collTopUp: 0, _collWithdrawal: _collWithdrawal, _LUSDChange: 0, _isDebtIncrease: false, _upperHint: _upperHint, _lowerHint: _lowerHint })); } // Withdraw LUSD tokens from a trove: mint new LUSD tokens to the owner, and increase the trove's debt accordingly function withdrawLUSD(address _collateral, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(Params_adjustTroveFor({ _borrower: msg.sender, _collateral: _collateral, _maxFeePercentage: _maxFeePercentage, _collTopUp: 0, _collWithdrawal: 0, _LUSDChange: _LUSDAmount, _isDebtIncrease: true, _upperHint: _upperHint, _lowerHint: _lowerHint })); } // Repay LUSD tokens to a Trove: Burn the repaid LUSD tokens, and reduce the trove's debt accordingly function repayLUSD(address _collateral, uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(Params_adjustTroveFor({ _borrower: msg.sender, _collateral: _collateral, _maxFeePercentage: 0, _collTopUp: 0, _collWithdrawal: 0, _LUSDChange: _LUSDAmount, _isDebtIncrease: false, _upperHint: _upperHint, _lowerHint: _lowerHint })); } function adjustTroveFor(Params_adjustTroveFor memory params) external override returns (address, address) { _requireCallerIsLeverager(); if (params._collTopUp != 0) { _requireSufficientCollateralBalanceAndAllowance(msg.sender, params._collateral, params._collTopUp); } return _adjustTrove(params); } function adjustTrove(address _collateral, uint _maxFeePercentage, uint _collTopUp, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint) external override { if (_collTopUp != 0) { _requireSufficientCollateralBalanceAndAllowance(msg.sender, _collateral, _collTopUp); } _adjustTrove(Params_adjustTroveFor(msg.sender, _collateral, _maxFeePercentage, _collTopUp, _collWithdrawal, _LUSDChange, _isDebtIncrease, _upperHint, _lowerHint)); } /* * _adjustTrove(): Alongside a debt change, this function can perform either a collateral top-up or a collateral withdrawal. * * It therefore expects either a positive _collTopUp argument, or a positive _collWithdrawal argument. * * If both are positive, it will revert. */ function _adjustTrove(Params_adjustTroveFor memory params) internal returns (address, address) { ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, lusdToken); LocalVariables_adjustTrove memory vars; vars.collCCR = collateralConfig.getCollateralCCR(params._collateral); vars.collMCR = collateralConfig.getCollateralMCR(params._collateral); vars.collDecimals = collateralConfig.getCollateralDecimals(params._collateral); vars.price = priceFeed.fetchPrice(params._collateral); bool isRecoveryMode = _checkRecoveryMode(params._collateral, vars.price, vars.collCCR, vars.collDecimals); if (params._isDebtIncrease) { _requireValidMaxFeePercentage(params._maxFeePercentage, isRecoveryMode, params._borrower); _requireNonZeroDebtChange(params._LUSDChange); } _requireSingularCollChange(params._collTopUp, params._collWithdrawal); _requireNonZeroAdjustment(params._collTopUp, params._collWithdrawal, params._LUSDChange); _requireTroveisActive(contractsCache.troveManager, params._borrower, params._collateral); // Confirm the operation is a borrower adjusting their own trove (possibly through the Leverager) assert(msg.sender == params._borrower || msg.sender == leveragerAddress); contractsCache.troveManager.applyPendingRewards(params._borrower, params._collateral); // Get the collChange based on whether or not collateral was sent in the transaction (vars.collChange, vars.isCollIncrease) = _getCollChange(params._collTopUp, params._collWithdrawal); vars.netDebtChange = params._LUSDChange; // If the adjustment incorporates a debt increase and system is in Normal Mode, then trigger a borrowing fee if (params._isDebtIncrease && !isRecoveryMode && !exemptFromFee[params._borrower]) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.lusdToken, params._LUSDChange, params._maxFeePercentage); vars.netDebtChange = vars.netDebtChange.add(vars.LUSDFee); // The raw debt change includes the fee } vars.debt = contractsCache.troveManager.getTroveDebt(params._borrower, params._collateral); vars.coll = contractsCache.troveManager.getTroveColl(params._borrower, params._collateral); // Get the trove's old ICR before the adjustment, and what its new ICR will be after the adjustment vars.oldICR = LiquityMath._computeCR(vars.coll, vars.debt, vars.price, vars.collDecimals); vars.newICR = _getNewICRFromTroveChange( vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, params._isDebtIncrease, vars.price, vars.collDecimals ); assert(params._collWithdrawal <= vars.coll); // Check the adjustment satisfies all conditions for the current system mode _requireValidAdjustmentInCurrentMode(isRecoveryMode, params._collateral, params._collWithdrawal, params._isDebtIncrease, vars); // When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough LUSD if (!params._isDebtIncrease && params._LUSDChange > 0) { _requireAtLeastMinNetDebt(_getNetDebt(vars.debt).sub(vars.netDebtChange)); _requireValidLUSDRepayment(vars.debt, vars.netDebtChange); _requireSufficientLUSDBalance(contractsCache.lusdToken, msg.sender, vars.netDebtChange); } (vars.newColl, vars.newDebt) = _updateTroveFromAdjustment(contractsCache.troveManager, params._borrower, params._collateral, vars.collChange, vars.isCollIncrease, vars.netDebtChange, params._isDebtIncrease); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(params._borrower, params._collateral); // Re-insert trove in to the sorted list uint newNICR = _getNewNominalICRFromTroveChange( vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, params._isDebtIncrease, vars.collDecimals ); (vars.newUpperHint, vars.newLowerHint) = sortedTroves.reInsert(params._borrower, params._collateral, newNICR, params._upperHint, params._lowerHint); emit TroveUpdated(params._borrower, params._collateral, vars.newDebt, vars.newColl, vars.stake, BorrowerOperation.adjustTrove); emit LUSDBorrowingFeePaid(params._borrower, params._collateral, vars.LUSDFee); // Use the unmodified _LUSDChange here, as we don't send the fee to the user _moveTokensAndCollateralfromAdjustment( contractsCache.activePool, contractsCache.lusdToken, msg.sender, params._collateral, vars.collChange, vars.isCollIncrease, params._LUSDChange, params._isDebtIncrease, vars.netDebtChange ); return (vars.newUpperHint, vars.newLowerHint); } function closeTroveFor(address _borrower, address _collateral) external override { _requireCallerIsLeverager(); _closeTrove(_borrower, _collateral); } function closeTrove(address _collateral) external override { _closeTrove(msg.sender, _collateral); } function _closeTrove(address _borrower, address _collateral) internal { ITroveManager troveManagerCached = troveManager; IActivePool activePoolCached = activePool; ILUSDToken lusdTokenCached = lusdToken; _requireTroveisActive(troveManagerCached, _borrower, _collateral); uint256 collCCR = collateralConfig.getCollateralCCR(_collateral); uint256 collDecimals = collateralConfig.getCollateralDecimals(_collateral); uint price = priceFeed.fetchPrice(_collateral); _requireNotInRecoveryMode(_collateral, price, collCCR, collDecimals); troveManagerCached.applyPendingRewards(_borrower, _collateral); uint coll = troveManagerCached.getTroveColl(_borrower, _collateral); uint debt = troveManagerCached.getTroveDebt(_borrower, _collateral); _requireSufficientLUSDBalance(lusdTokenCached, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); uint newTCR = _getNewTCRFromTroveChange(_collateral, coll, false, debt, false, price, collDecimals); _requireNewTCRisAboveCCR(newTCR, collCCR); troveManagerCached.removeStake(_borrower, _collateral); troveManagerCached.closeTrove(_borrower, _collateral, uint(TroveStatus.closedByOwner)); emit TroveUpdated(_borrower, _collateral, 0, 0, 0, BorrowerOperation.closeTrove); // Burn the repaid LUSD from the user's balance and the gas compensation from the Gas Pool _repayLUSD(activePoolCached, lusdTokenCached, _collateral, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); _repayLUSD(activePoolCached, lusdTokenCached, _collateral, gasPoolAddress, LUSD_GAS_COMPENSATION); // Send the collateral back to the user activePoolCached.sendCollateral(_collateral, msg.sender, coll); } /** * Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode */ function claimCollateral(address _collateral) external override { // send collateral from CollSurplus Pool to owner collSurplusPool.claimColl(msg.sender, _collateral); } // --- Helper functions --- function _triggerBorrowingFee(ITroveManager _troveManager, ILUSDToken _lusdToken, uint _LUSDAmount, uint _maxFeePercentage) internal returns (uint) { _troveManager.decayBaseRateFromBorrowing(); // decay the baseRate state variable uint LUSDFee = _troveManager.getBorrowingFee(_LUSDAmount); _requireUserAcceptsFee(LUSDFee, _LUSDAmount, _maxFeePercentage); // Send fee to LQTY staking contract lqtyStaking.increaseF_LUSD(LUSDFee); _lusdToken.mint(lqtyStakingAddress, LUSDFee); return LUSDFee; } function _getUSDValue(uint _coll, uint _price, uint256 _collDecimals) internal pure returns (uint) { uint usdValue = _price.mul(_coll).div(10**_collDecimals); return usdValue; } function _getCollChange( uint _collReceived, uint _requestedCollWithdrawal ) internal pure returns(uint collChange, bool isCollIncrease) { if (_collReceived != 0) { collChange = _collReceived; isCollIncrease = true; } else { collChange = _requestedCollWithdrawal; } } // Update trove's coll and debt based on whether they increase or decrease function _updateTroveFromAdjustment ( ITroveManager _troveManager, address _borrower, address _collateral, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal returns (uint, uint) { uint newColl = (_isCollIncrease) ? _troveManager.increaseTroveColl(_borrower, _collateral, _collChange) : _troveManager.decreaseTroveColl(_borrower, _collateral, _collChange); uint newDebt = (_isDebtIncrease) ? _troveManager.increaseTroveDebt(_borrower, _collateral, _debtChange) : _troveManager.decreaseTroveDebt(_borrower, _collateral, _debtChange); return (newColl, newDebt); } function _moveTokensAndCollateralfromAdjustment ( IActivePool _activePool, ILUSDToken _lusdToken, address _borrower, address _collateral, uint _collChange, bool _isCollIncrease, uint _LUSDChange, bool _isDebtIncrease, uint _netDebtChange ) internal { if (_isDebtIncrease) { _withdrawLUSD(_activePool, _lusdToken, _collateral, _borrower, _LUSDChange, _netDebtChange); } else { _repayLUSD(_activePool, _lusdToken, _collateral, _borrower, _LUSDChange); } if (_isCollIncrease) { IERC20(_collateral).safeTransferFrom(msg.sender, address(this), _collChange); _activePoolAddColl(_activePool, _collateral, _collChange); } else { _activePool.sendCollateral(_collateral, _borrower, _collChange); } } // Send collateral to Active Pool and increase its recorded collateral balance function _activePoolAddColl(IActivePool _activePool, address _collateral, uint _amount) internal { IERC20(_collateral).safeIncreaseAllowance(address(_activePool), _amount); _activePool.pullCollateralFromBorrowerOperationsOrDefaultPool(_collateral, _amount); } // Issue the specified amount of LUSD to _account and increases the total active debt (_netDebtIncrease potentially includes a LUSDFee) function _withdrawLUSD(IActivePool _activePool, ILUSDToken _lusdToken, address _collateral, address _account, uint _LUSDAmount, uint _netDebtIncrease) internal { _activePool.increaseLUSDDebt(_collateral, _netDebtIncrease); _lusdToken.mint(_account, _LUSDAmount); } // Burn the specified amount of LUSD from _account and decreases the total active debt function _repayLUSD(IActivePool _activePool, ILUSDToken _lusdToken, address _collateral, address _account, uint _LUSD) internal { _activePool.decreaseLUSDDebt(_collateral, _LUSD); _lusdToken.burn(_account, _LUSD); } // --- 'Require' wrapper functions --- function _requireValidCollateralAddress(address _collateral) internal view { require(collateralConfig.isCollateralAllowed(_collateral), "BorrowerOps: Invalid collateral address"); } function _requireSufficientCollateralBalanceAndAllowance(address _user, address _collateral, uint _collAmount) internal view { require(IERC20(_collateral).balanceOf(_user) >= _collAmount, "BorrowerOperations: Insufficient user collateral balance"); require(IERC20(_collateral).allowance(_user, address(this)) >= _collAmount, "BorrowerOperations: Insufficient collateral allowance"); } function _requireSingularCollChange(uint _collTopUp, uint _collWithdrawal) internal pure { require(_collTopUp == 0 || _collWithdrawal == 0, "BorrowerOperations: Cannot withdraw and add coll"); } function _requireNonZeroAdjustment(uint _collTopUp, uint _collWithdrawal, uint _LUSDChange) internal pure { require(_collTopUp != 0 || _collWithdrawal != 0 || _LUSDChange != 0, "BorrowerOps: There must be either a collateral change or a debt change"); } function _requireTroveisActive(ITroveManager _troveManager, address _borrower, address _collateral) internal view { uint status = _troveManager.getTroveStatus(_borrower, _collateral); require(status == uint(TroveStatus.active), "BorrowerOps: Trove does not exist or is closed"); } function _requireTroveisNotActive(ITroveManager _troveManager, address _borrower, address _collateral) internal view { uint status = _troveManager.getTroveStatus(_borrower, _collateral); require(status != uint(TroveStatus.active), "BorrowerOps: Trove is active"); } function _requireNonZeroDebtChange(uint _LUSDChange) internal pure { require(_LUSDChange > 0, "BorrowerOps: Debt increase requires non-zero debtChange"); } function _requireNotInRecoveryMode( address _collateral, uint _price, uint256 _CCR, uint256 _collateralDecimals ) internal view { require( !_checkRecoveryMode(_collateral, _price, _CCR, _collateralDecimals), "BorrowerOps: Operation not permitted during Recovery Mode" ); } function _requireNoCollWithdrawal(uint _collWithdrawal) internal pure { require(_collWithdrawal == 0, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode"); } function _requireValidAdjustmentInCurrentMode ( bool _isRecoveryMode, address _collateral, uint _collWithdrawal, bool _isDebtIncrease, LocalVariables_adjustTrove memory _vars ) internal view { /* *In Recovery Mode, only allow: * * - Pure collateral top-up * - Pure debt repayment * - Collateral top-up with debt repayment * - A debt increase combined with a collateral top-up which makes the ICR >= 150% and improves the ICR (and by extension improves the TCR). * * In Normal Mode, ensure: * * - The new ICR is above MCR * - The adjustment won't pull the TCR below CCR */ if (_isRecoveryMode) { _requireNoCollWithdrawal(_collWithdrawal); if (_isDebtIncrease) { _requireICRisAboveCCR(_vars.newICR, _vars.collCCR); _requireNewICRisAboveOldICR(_vars.newICR, _vars.oldICR); } } else { // if Normal Mode _requireICRisAboveMCR(_vars.newICR, _vars.collMCR); _vars.newTCR = _getNewTCRFromTroveChange( _collateral, _vars.collChange, _vars.isCollIncrease, _vars.netDebtChange, _isDebtIncrease, _vars.price, _vars.collDecimals ); _requireNewTCRisAboveCCR(_vars.newTCR, _vars.collCCR); } } function _requireICRisAboveMCR(uint _newICR, uint256 _MCR) internal pure { require(_newICR >= _MCR, "BorrowerOps: An operation that would result in ICR < MCR is not permitted"); } function _requireICRisAboveCCR(uint _newICR, uint256 _CCR) internal pure { require(_newICR >= _CCR, "BorrowerOps: Operation must leave trove with ICR >= CCR"); } function _requireNewICRisAboveOldICR(uint _newICR, uint _oldICR) internal pure { require(_newICR >= _oldICR, "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode"); } function _requireNewTCRisAboveCCR(uint _newTCR, uint256 _CCR) internal pure { require(_newTCR >= _CCR, "BorrowerOps: An operation that would result in TCR < CCR is not permitted"); } function _requireAtLeastMinNetDebt(uint _netDebt) internal pure { require (_netDebt >= MIN_NET_DEBT, "BorrowerOps: Trove's net debt must be greater than minimum"); } function _requireValidLUSDRepayment(uint _currentDebt, uint _debtRepayment) internal pure { require(_debtRepayment <= _currentDebt.sub(LUSD_GAS_COMPENSATION), "BorrowerOps: Amount repaid must not be larger than the Trove's debt"); } function _requireCallerIsLeverager() internal view { require(msg.sender == leveragerAddress, "BorrowerOps: Caller is not Leverager"); } function _requireSufficientLUSDBalance(ILUSDToken _lusdToken, address _borrower, uint _debtRepayment) internal view { require(_lusdToken.balanceOf(_borrower) >= _debtRepayment, "BorrowerOps: Caller doesnt have enough LUSD to make repayment"); } function _requireValidMaxFeePercentage(uint _maxFeePercentage, bool _isRecoveryMode, address _borrower) internal view { if (_isRecoveryMode || exemptFromFee[_borrower]) { require(_maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must less than or equal to 100%"); } else { require(_maxFeePercentage >= BORROWING_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must be between 0.5% and 100%"); } } // --- ICR and TCR getters --- // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewNominalICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint256 _collateralDecimals ) pure internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newNICR = LiquityMath._computeNominalCR(newColl, newDebt, _collateralDecimals); return newNICR; } // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price, uint256 _collateralDecimals ) pure internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newICR = LiquityMath._computeCR(newColl, newDebt, _price, _collateralDecimals); return newICR; } function _getNewTroveAmounts( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal pure returns (uint, uint) { uint newColl = _coll; uint newDebt = _debt; newColl = _isCollIncrease ? _coll.add(_collChange) : _coll.sub(_collChange); newDebt = _isDebtIncrease ? _debt.add(_debtChange) : _debt.sub(_debtChange); return (newColl, newDebt); } function _getNewTCRFromTroveChange ( address _collateral, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price, uint256 _collateralDecimals ) internal view returns (uint) { uint totalColl = getEntireSystemColl(_collateral); uint totalDebt = getEntireSystemDebt(_collateral); totalColl = _isCollIncrease ? totalColl.add(_collChange) : totalColl.sub(_collChange); totalDebt = _isDebtIncrease ? totalDebt.add(_debtChange) : totalDebt.sub(_debtChange); uint newTCR = LiquityMath._computeCR(totalColl, totalDebt, _price, _collateralDecimals); return newTCR; } function getCompositeDebt(uint _debt) external pure override returns (uint) { return _getCompositeDebt(_debt); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; contract BaseMath { uint constant public DECIMAL_PRECISION = 1e18; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; contract CheckContract { /** * Check that the account is an already deployed non-destroyed contract. * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12 */ function checkContract(address _account) internal view { require(_account != address(0), "Account cannot be zero address"); uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(_account) } require(size > 0, "Account code size cannot be zero"); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; // Buidler's helper contract for console logging library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function log() internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log()")); ignored; } function logInt(int p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(int)", p0)); ignored; } function logUint(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function logString(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function logBool(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function logAddress(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function logBytes(bytes memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes)", p0)); ignored; } function logByte(byte p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(byte)", p0)); ignored; } function logBytes1(bytes1 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes1)", p0)); ignored; } function logBytes2(bytes2 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes2)", p0)); ignored; } function logBytes3(bytes3 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes3)", p0)); ignored; } function logBytes4(bytes4 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes4)", p0)); ignored; } function logBytes5(bytes5 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes5)", p0)); ignored; } function logBytes6(bytes6 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes6)", p0)); ignored; } function logBytes7(bytes7 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes7)", p0)); ignored; } function logBytes8(bytes8 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes8)", p0)); ignored; } function logBytes9(bytes9 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes9)", p0)); ignored; } function logBytes10(bytes10 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes10)", p0)); ignored; } function logBytes11(bytes11 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes11)", p0)); ignored; } function logBytes12(bytes12 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes12)", p0)); ignored; } function logBytes13(bytes13 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes13)", p0)); ignored; } function logBytes14(bytes14 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes14)", p0)); ignored; } function logBytes15(bytes15 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes15)", p0)); ignored; } function logBytes16(bytes16 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes16)", p0)); ignored; } function logBytes17(bytes17 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes17)", p0)); ignored; } function logBytes18(bytes18 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes18)", p0)); ignored; } function logBytes19(bytes19 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes19)", p0)); ignored; } function logBytes20(bytes20 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes20)", p0)); ignored; } function logBytes21(bytes21 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes21)", p0)); ignored; } function logBytes22(bytes22 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes22)", p0)); ignored; } function logBytes23(bytes23 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes23)", p0)); ignored; } function logBytes24(bytes24 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes24)", p0)); ignored; } function logBytes25(bytes25 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes25)", p0)); ignored; } function logBytes26(bytes26 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes26)", p0)); ignored; } function logBytes27(bytes27 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes27)", p0)); ignored; } function logBytes28(bytes28 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes28)", p0)); ignored; } function logBytes29(bytes29 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes29)", p0)); ignored; } function logBytes30(bytes30 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes30)", p0)); ignored; } function logBytes31(bytes31 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes31)", p0)); ignored; } function logBytes32(bytes32 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes32)", p0)); ignored; } function log(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function log(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function log(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function log(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function log(uint p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint)", p0, p1)); ignored; } function log(uint p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string)", p0, p1)); ignored; } function log(uint p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool)", p0, p1)); ignored; } function log(uint p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address)", p0, p1)); ignored; } function log(string memory p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint)", p0, p1)); ignored; } function log(string memory p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); ignored; } function log(string memory p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool)", p0, p1)); ignored; } function log(string memory p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address)", p0, p1)); ignored; } function log(bool p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint)", p0, p1)); ignored; } function log(bool p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string)", p0, p1)); ignored; } function log(bool p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool)", p0, p1)); ignored; } function log(bool p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address)", p0, p1)); ignored; } function log(address p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint)", p0, p1)); ignored; } function log(address p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string)", p0, p1)); ignored; } function log(address p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool)", p0, p1)); ignored; } function log(address p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address)", p0, p1)); ignored; } function log(uint p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); ignored; } function log(uint p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); ignored; } function log(uint p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); ignored; } function log(uint p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); ignored; } function log(uint p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); ignored; } function log(bool p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); ignored; } function log(bool p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); ignored; } function log(bool p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); ignored; } function log(bool p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); ignored; } function log(address p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); ignored; } function log(address p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); ignored; } function log(address p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); ignored; } function log(address p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); ignored; } function log(address p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); ignored; } function log(address p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); ignored; } function log(address p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); ignored; } function log(address p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); ignored; } function log(address p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); ignored; } function log(address p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); ignored; } function log(address p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); ignored; } function log(address p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); ignored; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; /* * @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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; /** * Based on the OpenZeppelin IER20 interface: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol * * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; /** * @dev Interface of the ERC2612 standard as defined in the EIP. * * Adds the {permit} method, which can be used to change one's * {IERC20-allowance} without having to send a transaction, by signing a * message. This allows users to spend tokens without having to hold Ether. * * See https://eips.ethereum.org/EIPS/eip-2612. * * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ */ interface IERC2612 { /** * @dev Sets `amount` 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: * * - `owner` cannot be the zero address. * - `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 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current ERC2612 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. * * `owner` can limit the time a Permit is valid for by setting `deadline` to * a value in the near future. The deadline argument can be set to uint(-1) to * create Permits that effectively never expire. */ 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); function version() external view returns (string memory); function permitTypeHash() external view returns (bytes32); function domainSeparator() external view returns (bytes32); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./BaseMath.sol"; import "./LiquityMath.sol"; import "../Interfaces/IActivePool.sol"; import "../Interfaces/IDefaultPool.sol"; import "../Interfaces/IPriceFeed.sol"; import "../Interfaces/ILiquityBase.sol"; /* * Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and * common functions. */ contract LiquityBase is BaseMath, ILiquityBase { using SafeMath for uint; uint constant public _100pct = 1000000000000000000; // 1e18 == 100% // Amount of LUSD to be locked in gas pool on opening troves uint constant public LUSD_GAS_COMPENSATION = 10e18; // Minimum amount of net LUSD debt a trove must have uint constant public MIN_NET_DEBT = 90e18; // uint constant public MIN_NET_DEBT = 0; uint constant public PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% uint constant public BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% IActivePool public activePool; IDefaultPool public defaultPool; IPriceFeed public override priceFeed; // --- Gas compensation functions --- // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation function _getCompositeDebt(uint _debt) internal pure returns (uint) { return _debt.add(LUSD_GAS_COMPENSATION); } function _getNetDebt(uint _debt) internal pure returns (uint) { return _debt.sub(LUSD_GAS_COMPENSATION); } // Return the amount of ETH to be drawn from a trove's collateral and sent as gas compensation. function _getCollGasCompensation(uint _entireColl) internal pure returns (uint) { return _entireColl / PERCENT_DIVISOR; } function getEntireSystemColl(address _collateral) public view returns (uint entireSystemColl) { uint activeColl = activePool.getCollateral(_collateral); uint liquidatedColl = defaultPool.getCollateral(_collateral); return activeColl.add(liquidatedColl); } function getEntireSystemDebt(address _collateral) public view returns (uint entireSystemDebt) { uint activeDebt = activePool.getLUSDDebt(_collateral); uint closedDebt = defaultPool.getLUSDDebt(_collateral); return activeDebt.add(closedDebt); } function _getTCR(address _collateral, uint _price, uint256 _collateralDecimals) internal view returns (uint TCR) { uint entireSystemColl = getEntireSystemColl(_collateral); uint entireSystemDebt = getEntireSystemDebt(_collateral); TCR = LiquityMath._computeCR(entireSystemColl, entireSystemDebt, _price, _collateralDecimals); return TCR; } function _checkRecoveryMode( address _collateral, uint _price, uint256 _CCR, uint256 _collateralDecimals ) internal view returns (bool) { uint TCR = _getTCR(_collateral, _price, _collateralDecimals); return TCR < _CCR; } function _requireUserAcceptsFee(uint _fee, uint _amount, uint _maxFeePercentage) internal pure { uint feePercentage = _fee.mul(DECIMAL_PRECISION).div(_amount); require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum"); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./SafeMath.sol"; import "./console.sol"; library LiquityMath { using SafeMath for uint; // Collateral decimals used for calculating collateralization ratios (CRs). // If collateral has > 18 decimals, its value is scaled down for CR calculation purposes. // If collateral has < 18 decimals, its value is scaled up for CR calculation purposes. uint256 internal constant CR_CALCULATION_DECIMALS = 18; uint internal constant DECIMAL_PRECISION = 1e18; /* Precision for Nominal ICR (independent of price). Rationale for the value: * * - Making it “too high” could lead to overflows. * - Making it “too low” could lead to an ICR equal to zero, due to truncation from Solidity floor division. * * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39 ETH, * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator. * */ uint internal constant NICR_PRECISION = 1e20; function _min(uint _a, uint _b) internal pure returns (uint) { return (_a < _b) ? _a : _b; } function _max(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a : _b; } /* * Multiply two decimal numbers and use normal rounding rules: * -round product up if 19'th mantissa digit >= 5 * -round product down if 19'th mantissa digit < 5 * * Used only inside the exponentiation, _decPow(). */ function decMul(uint x, uint y) internal pure returns (uint decProd) { uint prod_xy = x.mul(y); decProd = prod_xy.add(DECIMAL_PRECISION / 2).div(DECIMAL_PRECISION); } /* * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n. * * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. * * Called by two functions that represent time in units of minutes: * 1) TroveManager._calcDecayedBaseRate * 2) CommunityIssuance._getCumulativeIssuanceFraction * * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals * "minutes in 1000 years": 60 * 24 * 365 * 1000 * * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be * negligibly different from just passing the cap, since: * * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible */ function _decPow(uint _base, uint _minutes) internal pure returns (uint) { if (_minutes > 525600000) {_minutes = 525600000;} // cap to avoid overflow if (_minutes == 0) {return DECIMAL_PRECISION;} uint y = DECIMAL_PRECISION; uint x = _base; uint n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n.div(2); } else { // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n.sub(1)).div(2); } } return decMul(x, y); } function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a.sub(_b) : _b.sub(_a); } function _computeNominalCR(uint _coll, uint _debt, uint256 _collDecimals) internal pure returns (uint) { if (_debt > 0) { uint256 scaledColl = _getScaledCollAmount(_coll, _collDecimals); return scaledColl.mul(NICR_PRECISION).div(_debt); } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } function _computeCR(uint _coll, uint _debt, uint _price, uint _collDecimals) internal pure returns (uint) { if (_debt > 0) { uint256 scaledColl = _getScaledCollAmount(_coll, _collDecimals); uint newCollRatio = scaledColl.mul(_price).div(_debt); return newCollRatio; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } function _getScaledCollAmount(uint256 _collAmount, uint256 _collDecimals) internal pure returns (uint256 scaledColl) { scaledColl = _collAmount; if (_collDecimals > CR_CALCULATION_DECIMALS) { scaledColl = scaledColl.div(10 ** (_collDecimals - CR_CALCULATION_DECIMALS)); } else if (_collDecimals < CR_CALCULATION_DECIMALS) { scaledColl = scaledColl.mul(10 ** (CR_CALCULATION_DECIMALS - _collDecimals)); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./Address.sol"; import "./IERC20.sol"; import "./SafeMath.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 SafeMath for uint256; 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' // solhint-disable-next-line max-line-length 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; /** * Based on OpenZeppelin's SafeMath: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol * * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./IPool.sol"; interface IActivePool is IPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event ActivePoolLUSDDebtUpdated(address _collateral, uint _LUSDDebt); event ActivePoolCollateralBalanceUpdated(address _collateral, uint _amount); // --- Functions --- function sendCollateral(address _collateral, address _account, uint _amount) external; function pullCollateralFromBorrowerOperationsOrDefaultPool(address _collateral, uint _amount) external; function setYieldGenerator(address _collateral, address _vault) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; pragma experimental ABIEncoderV2; // Common interface for the Trove Manager. interface IBorrowerOperations { /* --- Variable container structs --- Used to hold, return and assign variables inside a function, in order to avoid the error: "CompilerError: Stack too deep". */ struct Params_adjustTroveFor { address _borrower; address _collateral; uint _maxFeePercentage; uint _collTopUp; uint _collWithdrawal; uint _LUSDChange; bool _isDebtIncrease; address _upperHint; address _lowerHint; } // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LUSDTokenAddressChanged(address _lusdTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event TroveCreated(address indexed _borrower, address _collateral, uint arrayIndex); event TroveUpdated(address indexed _borrower, address _collateral, uint _debt, uint _coll, uint stake, uint8 operation); event LUSDBorrowingFeePaid(address indexed _borrower, address _collateral, uint _LUSDFee); // --- Functions --- function setAddresses( address _collateralConfigAddress, address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _lusdTokenAddress, address _lqtyStakingAddress, address _leveragerAddress ) external; function openTrove(address _collateral, uint _collAmount, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external; function openTroveFor(address _borrower, address _collateral, uint _collAmount, uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external returns (address, address); function addColl(address _collateral, uint _collAmount, address _upperHint, address _lowerHint) external; function withdrawColl(address _collateral, uint _amount, address _upperHint, address _lowerHint) external; function withdrawLUSD(address _collateral, uint _maxFee, uint _amount, address _upperHint, address _lowerHint) external; function repayLUSD(address _collateral, uint _amount, address _upperHint, address _lowerHint) external; function closeTrove(address _collateral) external; function closeTroveFor(address _borrower, address _collateral) external; function adjustTrove(address _collateral, uint _maxFeePercentage, uint _collTopUp, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint) external; function adjustTroveFor(Params_adjustTroveFor memory) external returns (address, address); function claimCollateral(address _collateral) external; function getCompositeDebt(uint _debt) external pure returns (uint); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface ICollateralConfig { function getAllowedCollaterals() external view returns (address[] memory); function getCollateralCCR(address _collateral) external view returns (uint256); function getCollateralDecimals(address _collateral) external view returns (uint256); function getCollateralMCR(address _collateral) external view returns (uint256); function getCollateralDebtLimit(address _collateral) external view returns (uint256); function isCollateralAllowed(address _collateral) external view returns (bool); function getCollateralChainlinkTimeout(address _collateral) external view returns (uint256); function getCollateralTellorTimeout(address _collateral) external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface ICollSurplusPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event CollBalanceUpdated(address indexed _account, address _collateral, uint _newBalance); event CollateralSent(address _collateral, address _to, uint _amount); // --- Contract setters --- function setAddresses( address _collateralConfigAddress, address _borrowerOperationsAddress, address _troveManagerAddress, address _liquidationHelperAddress, address _activePoolAddress ) external; function getCollateral(address _collateral) external view returns (uint); function getUserCollateral(address _account, address _collateral) external view returns (uint); function accountSurplus(address _account, address _collateral, uint _amount) external; function claimColl(address _account, address _collateral) external; function pullCollateralFromActivePool(address _collateral, uint _amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./IPool.sol"; interface IDefaultPool is IPool { // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event DefaultPoolLUSDDebtUpdated(address _collateral, uint _LUSDDebt); event DefaultPoolCollateralBalanceUpdated(address _collateral, uint _amount); // --- Functions --- function sendCollateralToActivePool(address _collateral, uint _amount) external; function pullCollateralFromActivePool(address _collateral, uint _amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./IStabilityPool.sol"; interface ILiquidationHelper { function liquidate(address _borrower, address _collateral, address _caller) external; function liquidateTroves(address _collateral, uint _n, address _caller) external; function batchLiquidateTroves(address _collateral, address[] memory _troveArray, address _caller) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./IPriceFeed.sol"; interface ILiquityBase { function priceFeed() external view returns (IPriceFeed); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface ILQTYStaking { // --- Events -- event LQTYTokenAddressSet(address _lqtyTokenAddress); event LUSDTokenAddressSet(address _lusdTokenAddress); event TroveManagerAddressSet(address _troveManager); event RedemptionHelperAddressSet(address _redemptionHelperAddress); event BorrowerOperationsAddressSet(address _borrowerOperationsAddress); event ActivePoolAddressSet(address _activePoolAddress); event CollateralConfigAddressSet(address _collateralConfigAddress); event StakeChanged(address indexed staker, uint newStake); event StakingGainsWithdrawn(address indexed staker, uint LUSDGain, address[] _assets, uint[] _amounts); event F_CollateralUpdated(address _collateral, uint _F_Collateral); event F_LUSDUpdated(uint _F_LUSD); event TotalLQTYStakedUpdated(uint _totalLQTYStaked); event CollateralSent(address _account, address _collateral, uint _amount); event StakerSnapshotsUpdated(address _staker, address[] _assets, uint[] _amounts, uint _F_LUSD); // --- Functions --- function setAddresses ( address _lqtyTokenAddress, address _lusdTokenAddress, address _troveManagerAddress, address _redemptionHelperAddress, address _borrowerOperationsAddress, address _activePoolAddress, address _collateralConfigAddress ) external; function stake(uint _LQTYamount) external; function unstake(uint _LQTYamount) external; function increaseF_Collateral(address _collateral, uint _collFee) external; function increaseF_LUSD(uint _LQTYFee) external; function getPendingCollateralGain(address _user) external view returns (address[] memory, uint[] memory); function getPendingLUSDGain(address _user) external view returns (uint); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "../Dependencies/IERC20.sol"; import "../Dependencies/IERC2612.sol"; interface ILUSDToken is IERC20, IERC2612 { // --- Events --- event TroveManagerAddressChanged(address _troveManagerAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event LUSDTokenBalanceUpdated(address _user, uint _amount); // --- Functions --- function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; function sendToPool(address _sender, address poolAddress, uint256 _amount) external; function returnFromPool(address poolAddress, address user, uint256 _amount ) external; function getDeploymentStartTime() external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; // Common interface for the Pools. interface IPool { // --- Events --- event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event CollateralSent(address _collateral, address _to, uint _amount); // --- Functions --- function getCollateral(address _collateral) external view returns (uint); function getLUSDDebt(address _collateral) external view returns (uint); function increaseLUSDDebt(address _collateral, uint _amount) external; function decreaseLUSDDebt(address _collateral, uint _amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface IPriceFeed { // --- Events --- event LastGoodPriceUpdated(address _collateral, uint _lastGoodPrice); // --- Function --- function fetchPrice(address _collateral) external returns (uint); function updateChainlinkAggregator( address _collateral, address _priceAggregatorAddress ) external; function updateTellorQueryID(address _collateral, bytes32 _queryId) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface IRedemptionHelper { function redeemCollateral( address _collateral, address _redeemer, uint _LUSDamount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint _partialRedemptionHintNICR, uint _maxIterations, uint _maxFeePercentage ) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; // Common interface for the SortedTroves Doubly Linked List. interface ISortedTroves { // --- Events --- event SortedTrovesAddressChanged(address _sortedDoublyLLAddress); event BorrowerOperationsAddressChanged(address _borrowerOperationsAddress); event NodeAdded(address _collateral, address _id, uint _NICR); event NodeRemoved(address _collateral, address _id); // --- Functions --- function setParams(address _TroveManagerAddress, address _borrowerOperationsAddress) external; function insert(address _collateral, address _id, uint256 _ICR, address _prevId, address _nextId) external returns (address, address); function remove(address _collateral, address _id) external; function reInsert(address _id, address _collateral, uint256 _newICR, address _prevId, address _nextId) external returns (address, address); function contains(address _collateral, address _id) external view returns (bool); function isEmpty(address _collateral) external view returns (bool); function getSize(address _collateral) external view returns (uint256); function getFirst(address _collateral) external view returns (address); function getLast(address _collateral) external view returns (address); function getNext(address _collateral, address _id) external view returns (address); function getPrev(address _collateral, address _id) external view returns (address); function validInsertPosition(address _collateral, uint256 _ICR, address _prevId, address _nextId) external view returns (bool); function findInsertPosition(address _collateral, uint256 _ICR, address _prevId, address _nextId) external view returns (address, address); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; interface IStabilityPool { // --- Events --- event StabilityPoolCollateralBalanceUpdated(address _collateral, uint _newBalance); event StabilityPoolLUSDBalanceUpdated(uint _newBalance); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event LiquidationHelperAddressChanged(address _liquidationHelperAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event SortedTrovesAddressChanged(address _newSortedTrovesAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event CommunityIssuanceAddressChanged(address _newCommunityIssuanceAddress); event P_Updated(uint _P); event S_Updated(address _collateral, uint _S, uint128 _epoch, uint128 _scale); event G_Updated(uint _G, uint128 _epoch, uint128 _scale); event EpochUpdated(uint128 _currentEpoch); event ScaleUpdated(uint128 _currentScale); event DepositSnapshotUpdated(address indexed _depositor, uint _P, address[] _assets, uint[] _amounts, uint _G); event UserDepositChanged(address indexed _depositor, uint _newDeposit); event CollateralGainWithdrawn(address indexed _depositor, address _collateral, uint _collAmount); event LQTYPaidToDepositor(address indexed _depositor, uint _LQTY); event CollateralSent(address _collateral, address _to, uint _amount); // --- Functions --- /* * Called only once on init, to set addresses of other Liquity contracts * Callable only by owner, renounces ownership at the end */ function setAddresses( address _borrowerOperationsAddress, address _collateralConfigAddress, address _troveManagerAddress, address _liquidationHelperAddress, address _activePoolAddress, address _lusdTokenAddress, address _sortedTrovesAddress, address _priceFeedAddress, address _communityIssuanceAddress ) external; /* * Initial checks: * - _amount is not zero * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors * - Sends depositor's accumulated gains (LQTY, ETH) to depositor * - Increases depositor's deposit, and takes new snapshot. */ function provideToSP(uint _amount) external; /* * Initial checks: * - _amount is zero or there are no under collateralized troves left in the system * - User has a non zero deposit * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors * - Sends all depositor's accumulated gains (LQTY, ETH) to depositor * - Decreases depositor's deposit, and takes new snapshot. * * If _amount > userDeposit, the user withdraws all of their compounded deposit. */ function withdrawFromSP(uint _amount) external; /* * Initial checks: * - Caller is TroveManager * --- * Cancels out the specified debt against the LUSD contained in the Stability Pool (as far as possible) * and transfers the Trove's collateral from ActivePool to StabilityPool. * Only called by liquidation functions in the TroveManager. */ function offset(address _collateral, uint _debt, uint _coll) external; /* * Returns the total amount of the specified collateral held by the pool, accounted in an internal variable. */ function getCollateral(address _collateral) external view returns (uint); /* * Returns LUSD held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset. */ function getTotalLUSDDeposits() external view returns (uint); /* * Calculates the collateral gain earned by the deposit since its last snapshots were taken. */ function getDepositorCollateralGain(address _depositor) external view returns (address[] memory assets, uint[] memory amounts); /* * Calculate the LQTY gain earned by a deposit since its last snapshots were taken. * If not tagged with a front end, the depositor gets a 100% cut of what their deposit earned. * Otherwise, their cut of the deposit's earnings is equal to the kickbackRate, set by the front end through * which they made their deposit. */ function getDepositorLQTYGain(address _depositor) external view returns (uint); /* * Return the user's compounded deposit. */ function getCompoundedLUSDDeposit(address _depositor) external view returns (uint); /* * A depositor's snapshot struct now contains a mapping for the running sum (S) for each collateral. * Mappings within a struct are not accessible via the auto-generated getters in the ABI, so we provide * this separate function that will return the specified depositor's "S" snapshot for the given collateral. */ function depositSnapshots_S(address _depositor, address _collateral) external view returns (uint); /* * Fallback function * Only callable by Active Pool, it just accounts for ETH received * receive() external payable; */ }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.6.11; import "./ILiquityBase.sol"; import "./IActivePool.sol"; import "./IDefaultPool.sol"; import "./IStabilityPool.sol"; import "./ILUSDToken.sol"; import "./ILQTYStaking.sol"; import "./IRedemptionHelper.sol"; import "./ILiquidationHelper.sol"; import "../Dependencies/IERC20.sol"; enum TroveStatus { nonExistent, active, closedByOwner, closedByLiquidation, closedByRedemption } // Common interface for the Trove Manager. interface ITroveManager is ILiquityBase { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LQTYTokenAddressChanged(address _lqtyTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event Liquidation(address _collateral, uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _LUSDGasCompensation); event TroveUpdated(address indexed _borrower, address _collateral, uint _debt, uint _coll, uint _stake, uint8 _operation); event TroveLiquidated(address indexed _borrower, address _collateral, uint _debt, uint _coll, uint8 _operation); event BaseRateUpdated(uint _baseRate); event LastFeeOpTimeUpdated(uint _lastFeeOpTime); event TotalStakesUpdated(address _collateral, uint _newTotalStakes); event SystemSnapshotsUpdated(address _collateral, uint _totalStakesSnapshot, uint _totalCollateralSnapshot); event LTermsUpdated(address _collateral, uint _L_Collateral, uint _L_LUSDDebt); event TroveSnapshotsUpdated(address _collateral, uint _L_Collateral, uint _L_LUSDDebt); event TroveIndexUpdated(address _borrower, address _collateral, uint _newIndex); event Redemption( address _collateral, uint _attemptedLUSDAmount, uint _actualLUSDAmount, uint _collSent, uint _collFee ); // --- Functions --- function setAddresses( address _borrowerOperationsAddress, address _collateralConfigAddress, address _activePoolAddress, address _defaultPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _lusdTokenAddress, address _sortedTrovesAddress, address _lqtyTokenAddress, address _lqtyStakingAddress, address _redemptionHelperAddress, address _liquidationHelperAddress ) external; function REDEMPTION_FEE_FLOOR() external pure returns (uint256); function lusdToken() external view returns (ILUSDToken); function lqtyToken() external view returns (IERC20); function lqtyStaking() external view returns (ILQTYStaking); function getTroveOwnersCount(address _collateral) external view returns (uint); function getTroveFromTroveOwnersArray(address _collateral, uint _index) external view returns (address); function getNominalICR(address _borrower, address _collateral) external view returns (uint); function getCurrentICR(address _borrower, address _collateral, uint _price) external view returns (uint); function liquidate(address _borrower, address _collateral) external; function liquidateTroves(address _collateral, uint _n) external; function batchLiquidateTroves(address _collateral, address[] calldata _troveArray) external; function sendGasCompensation(IActivePool _activePool, address _collateral, address _liquidator, uint _LUSD, uint _collAmount) external; function movePendingTroveRewardsToActivePool( IActivePool _activePool, IDefaultPool _defaultPool, address _collateral, uint _LUSD, uint _collAmount ) external; function redeemCollateral( address _collateral, uint _LUSDAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint _partialRedemptionHintNICR, uint _maxIterations, uint _maxFee ) external; function redeemCloseTrove(address _borrower, address _collateral, uint256 _LUSD, uint256 _collAmount) external; function reInsert(address _id, address _collateral, uint256 _newNICR, address _prevId, address _nextId) external; function updateDebtAndCollAndStakesPostRedemption( address _borrower, address _collateral, uint256 _newDebt, uint256 _newColl ) external; function burnLUSDAndEmitRedemptionEvent( address _redeemer, address _collateral, uint _attemptedLUSDAmount, uint _actualLUSDAmount, uint _collSent, uint _collFee ) external; function updateBaseRateFromRedemption( uint _collateralDrawn, uint _price, uint256 _collDecimals, uint _totalLUSDSupply ) external returns (uint); function updateStakeAndTotalStakes(address _borrower, address _collateral) external returns (uint); function updateTroveRewardSnapshots(address _borrower, address _collateral) external; function updateSystemSnapshots_excludeCollRemainder(IActivePool _activePool, address _collateral, uint _collRemainder) external; function emitTroveLiquidatedAndTroveUpdated( address _borrower, address _collateral, uint _debt, uint _coll, bool _isRecoveryMode ) external; function emitLiquidationEvent( address _collateral, uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _LUSDGasCompensation ) external; function redistributeDebtAndColl( IActivePool _activePool, IDefaultPool _defaultPool, address _collateral, uint _debt, uint _coll, uint256 _collDecimals ) external; function addTroveOwnerToArray(address _borrower, address _collateral) external returns (uint index); function applyPendingRewards(address _borrower, address _collateral) external; function getPendingCollateralReward(address _borrower, address _collateral) external view returns (uint); function getPendingLUSDDebtReward(address _borrower, address _collateral) external view returns (uint); function hasPendingRewards(address _borrower, address _collateral) external view returns (bool); function getEntireDebtAndColl(address _borrower, address _collateral) external view returns ( uint debt, uint coll, uint pendingLUSDDebtReward, uint pendingCollateralReward ); function closeTrove(address _borrower, address _collateral, uint256 _closedStatusNum) external; function removeStake(address _borrower, address _collateral) external; function getRedemptionRate() external view returns (uint); function getRedemptionRateWithDecay() external view returns (uint); function getRedemptionFee(uint _collateralDrawn) external view returns (uint); function getRedemptionFeeWithDecay(uint _collateralDrawn) external view returns (uint); function getBorrowingRate() external view returns (uint); function getBorrowingRateWithDecay() external view returns (uint); function getBorrowingFee(uint LUSDDebt) external view returns (uint); function getBorrowingFeeWithDecay(uint _LUSDDebt) external view returns (uint); function decayBaseRateFromBorrowing() external; function getTroveStatus(address _borrower, address _collateral) external view returns (uint); function getTroveStake(address _borrower, address _collateral) external view returns (uint); function getTroveDebt(address _borrower, address _collateral) external view returns (uint); function getTroveColl(address _borrower, address _collateral) external view returns (uint); function setTroveStatus(address _borrower, address _collateral, uint num) external; function increaseTroveColl(address _borrower, address _collateral, uint _collIncrease) external returns (uint); function decreaseTroveColl(address _borrower, address _collateral, uint _collDecrease) external returns (uint); function increaseTroveDebt(address _borrower, address _collateral, uint _debtIncrease) external returns (uint); function decreaseTroveDebt(address _borrower, address _collateral, uint _collDecrease) external returns (uint); function getTCR(address _collateral, uint _price) external view returns (uint); function checkRecoveryMode(address _collateral, uint _price) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_activePoolAddress","type":"address"}],"name":"ActivePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_collSurplusPoolAddress","type":"address"}],"name":"CollSurplusPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newCollateralConfigAddress","type":"address"}],"name":"CollateralConfigAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_defaultPoolAddress","type":"address"}],"name":"DefaultPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_gasPoolAddress","type":"address"}],"name":"GasPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_lqtyStakingAddress","type":"address"}],"name":"LQTYStakingAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"address","name":"_collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"_LUSDFee","type":"uint256"}],"name":"LUSDBorrowingFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_lusdTokenAddress","type":"address"}],"name":"LUSDTokenAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_leverager","type":"address"}],"name":"LeveragerAddressChanged","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":"_newPriceFeedAddress","type":"address"}],"name":"PriceFeedAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetFeeExemption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sortedTrovesAddress","type":"address"}],"name":"SortedTrovesAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"address","name":"_collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"arrayIndex","type":"uint256"}],"name":"TroveCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newTroveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"address","name":"_collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"_debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_coll","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"enum BorrowerOperations.BorrowerOperation","name":"operation","type":"uint8"}],"name":"TroveUpdated","type":"event"},{"inputs":[],"name":"BORROWING_FEE_FLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMAL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD_GAS_COMPENSATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_NET_DEBT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_100pct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePool","outputs":[{"internalType":"contract IActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"addColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collTopUp","type":"uint256"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"uint256","name":"_LUSDChange","type":"uint256"},{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"adjustTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collTopUp","type":"uint256"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"uint256","name":"_LUSDChange","type":"uint256"},{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"internalType":"struct IBorrowerOperations.Params_adjustTroveFor","name":"params","type":"tuple"}],"name":"adjustTroveFor","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"claimCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"closeTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"address","name":"_collateral","type":"address"}],"name":"closeTroveFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateralConfig","outputs":[{"internalType":"contract ICollateralConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPool","outputs":[{"internalType":"contract IDefaultPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debt","type":"uint256"}],"name":"getCompositeDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"getEntireSystemColl","outputs":[{"internalType":"uint256","name":"entireSystemColl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"getEntireSystemDebt","outputs":[{"internalType":"uint256","name":"entireSystemDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leveragerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lqtyStaking","outputs":[{"internalType":"contract ILQTYStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lqtyStakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lusdToken","outputs":[{"internalType":"contract ILUSDToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"openTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"openTroveFor","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"repayLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralConfigAddress","type":"address"},{"internalType":"address","name":"_troveManagerAddress","type":"address"},{"internalType":"address","name":"_activePoolAddress","type":"address"},{"internalType":"address","name":"_defaultPoolAddress","type":"address"},{"internalType":"address","name":"_gasPoolAddress","type":"address"},{"internalType":"address","name":"_collSurplusPoolAddress","type":"address"},{"internalType":"address","name":"_priceFeedAddress","type":"address"},{"internalType":"address","name":"_sortedTrovesAddress","type":"address"},{"internalType":"address","name":"_lusdTokenAddress","type":"address"},{"internalType":"address","name":"_lqtyStakingAddress","type":"address"},{"internalType":"address","name":"_leveragerAddress","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leveragerAddress","type":"address"}],"name":"setLeveragerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sortedTroves","outputs":[{"internalType":"contract ISortedTroves","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"troveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526003805460ff60a01b191690553480156200001e57600080fd5b506000620000346001600160e01b036200008816565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200008c565b3390565b614e0c806200009c6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063741bef1a1161013b5780639e86d0c4116100b8578063b83f91a21161007c578063b83f91a214610447578063bedafd011461044f578063cbd138ae14610462578063f2fde38b14610475578063f92d3433146104885761023d565b80639e86d0c41461040f578063a20baee614610375578063a3a6401714610422578063a3f4df7e1461042a578063ae9187541461043f5761023d565b80637da0b1fa116100ff5780637da0b1fa146103c65780637f7dde4a146103d95780638235b284146103e157806386a3e59a146103f45780638da5cb5b146104075761023d565b8063741bef1a1461037d5780637439902114610385578063761ab22c1461039857806376b00ddd146103a05780637985c5e4146103b35761023d565b806349b010c5116101c95780635c0ab4de1161018d5780635c0ab4de1461033f5780635e66c921146103475780636de903ca1461035a578063715018a61461036d57806372fe25aa146103755761023d565b806349b010c5146102eb5780634eab22fe146102fe5780634ff814431461030657806358e4b73114610319578063595a59c51461032c5761023d565b80632e86bbd8116102105780632e86bbd8146102a95780633cc74225146102b15780633d83908a146102c65780634870dd9a146102ce57806348a4a39d146102d65761023d565b80630e41879c14610242578063158ef93e1461026c5780631bf435551461028157806327d04b3514610296575b600080fd5b610255610250366004613f8b565b610490565b6040516102639291906142ed565b60405180910390f35b6102746104ba565b60405161026391906143cf565b6102896104ca565b6040516102639190614d4d565b6102896102a4366004613e2b565b6104d7565b6102896105f8565b6102b9610604565b60405161026391906142d9565b6102b9610613565b610289610622565b6102e96102e4366004614032565b610627565b005b6102e96102f9366004614032565b6106ac565b6102b961071e565b61028961031436600461428d565b61072d565b610274610327366004613e2b565b61073e565b6102e961033a366004613e47565b610753565b6102b9610769565b6102e9610355366004614084565b610778565b6102e9610368366004613e2b565b6107f2565b6102e9610899565b610289610922565b6102b961092e565b6102e9610393366004614148565b61093d565b6102b96109c8565b6102556103ae3660046141e8565b6109d7565b6102e96103c1366004613ead565b610a11565b6102e96103d43660046140e2565b610e07565b6102b9610e20565b6102e96103ef366004613e2b565b610e2f565b6102e9610402366004614032565b610e96565b6102b9610f08565b61028961041d366004613e2b565b610f17565b6102b9610fce565b610432610fdd565b60405161026391906143da565b6102b961100b565b6102b961101a565b6102e961045d366004614005565b611029565b6102e9610470366004613e2b565b6110ca565b6102e9610483366004613e2b565b6110d7565b610289611198565b60008061049b6111a3565b6104aa898989898989896111cf565b9150915097509795505050505050565b600354600160a01b900460ff1681565b6804e1003b28d928000081565b60008054604051634b14fa8760e01b815282916001600160a01b031690634b14fa87906105089086906004016142d9565b60206040518083038186803b15801561052057600080fd5b505afa158015610534573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055891906142a5565b600154604051634b14fa8760e01b81529192506000916001600160a01b0390911690634b14fa879061058e9087906004016142d9565b60206040518083038186803b1580156105a657600080fd5b505afa1580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906142a5565b90506105f0828263ffffffff611aa116565b949350505050565b678ac7230489e8000081565b6001546001600160a01b031681565b6006546001600160a01b031681565b60c881565b610632338585611acd565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020018581526020016000815260200160008152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b505050505050565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020016000815260200185815260200160008152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b600d546001600160a01b031681565b6000610738826124db565b92915050565b60046020526000908152604090205460ff1681565b61075b6111a3565b61076582826124f5565b5050565b6005546001600160a01b031681565b6107e9604051806101200160405280336001600160a01b03168152602001876001600160a01b031681526020018681526020016000815260200160008152602001858152602001600115158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b50505050505050565b6107fa612a23565b6001600160a01b031661080b610f08565b6001600160a01b03161461083a5760405162461bcd60e51b815260040161083190614811565b60405180910390fd5b61084381612a27565b600d80546001600160a01b0319166001600160a01b0383161790556040517fc9756a8fae9697c5cc7e3a2607c8f757af9828833744213558e0e911366c66119061088e9083906142d9565b60405180910390a150565b6108a1612a23565b6001600160a01b03166108b2610f08565b6001600160a01b0316146108d85760405162461bcd60e51b815260040161083190614811565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b670de0b6b3a764000081565b6002546001600160a01b031681565b851561094e5761094e338988611acd565b6109bc604051806101200160405280336001600160a01b031681526020018a6001600160a01b031681526020018981526020018881526020018781526020018681526020018515158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b50505050505050505050565b600a546001600160a01b031681565b6000806109e26111a3565b6060830151156109ff576109ff3384602001518560600151611acd565b610a0883611c0c565b91509150915091565b610a19612a23565b6001600160a01b0316610a2a610f08565b6001600160a01b031614610a505760405162461bcd60e51b815260040161083190614811565b600354600160a01b900460ff1615610a7a5760405162461bcd60e51b81526004016108319061452b565b610a838b612a27565b610a8c8a612a27565b610a9589612a27565b610a9e88612a27565b610aa787612a27565b610ab086612a27565b610ab985612a27565b610ac284612a27565b610acb83612a27565b610ad482612a27565b610add81612a27565b600580546001600160a01b03199081166001600160a01b038e8116919091179092556006805482168d84161790556000805482168c84161790556001805482168b84161790556007805482168a8416179055600880548216898416179055600280548216888416179055600c80548216878416179055600b80548216868416179055600a805482168584169081179091556009805483169091179055600d80549091169183169190911790556040517f6a69409f44477d8556c3c8040edc75d9bc1b3dee7846f6045c0b99556fe7bc9190610bb9908d906142d9565b60405180910390a17f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a56788a604051610bf091906142d9565b60405180910390a17f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd88289604051610c2791906142d9565b60405180910390a17f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b88604051610c5e91906142d9565b60405180910390a17fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa087604051610c9591906142d9565b60405180910390a17fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d86604051610ccc91906142d9565b60405180910390a17f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db26485604051610d0391906142d9565b60405180910390a17f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe7880084604051610d3a91906142d9565b60405180910390a17f227eec0ec317af6ab1a9587ffa1c84332522eb4c583a908f89babc05f8f339bd83604051610d7191906142d9565b60405180910390a17f756ebc192164c295bba134b5aacd72cc7aff8098a670d1f0a5f6b3a0b4ce670782604051610da891906142d9565b60405180910390a17fc9756a8fae9697c5cc7e3a2607c8f757af9828833744213558e0e911366c661181604051610ddf91906142d9565b60405180910390a150506003805460ff60a01b1916600160a01b179055505050505050505050565b610e16338787878787876111cf565b5050505050505050565b6000546001600160a01b031681565b60085460405163ea16003f60e01b81526001600160a01b039091169063ea16003f90610e6190339085906004016142ed565b600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b5050505050565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001858152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b6003546001600160a01b031690565b60008054604051639b56d6c960e01b815282916001600160a01b031690639b56d6c990610f489086906004016142d9565b60206040518083038186803b158015610f6057600080fd5b505afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9891906142a5565b600154604051639b56d6c960e01b81529192506000916001600160a01b0390911690639b56d6c99061058e9087906004016142d9565b6009546001600160a01b031681565b60405180604001604052806012815260200171426f72726f7765724f7065726174696f6e7360701b81525081565b600c546001600160a01b031681565b600b546001600160a01b031681565b611031612a23565b6001600160a01b0316611042610f08565b6001600160a01b0316146110685760405162461bcd60e51b815260040161083190614811565b6001600160a01b03821660009081526004602052604090819020805460ff1916831515179055517f2293b760d6615c0f087e78599ce64d67197a7dba78cdd9e241f3cd23b46101f3906110be908490849061435d565b60405180910390a15050565b6110d433826124f5565b50565b6110df612a23565b6001600160a01b03166110f0610f08565b6001600160a01b0316146111165760405162461bcd60e51b815260040161083190614811565b6001600160a01b03811661113c5760405162461bcd60e51b815260040161083190614451565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6611c37937e0800081565b600d546001600160a01b031633146111cd5760405162461bcd60e51b81526004016108319061440d565b565b6000806111db88612a6c565b6111e6338989611acd565b6111ee613cdc565b50604080516060810182526006546001600160a01b03908116825260005481166020830152600b541691810191909152611226613cfc565b60055460405163453ebeb560e11b81526001600160a01b0390911690638a7d7d6a90611256908d906004016142d9565b60206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a691906142a5565b81526005546040516311e2c60b60e11b81526001600160a01b03909116906323c58c16906112d8908d906004016142d9565b60206040518083038186803b1580156112f057600080fd5b505afa158015611304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132891906142a5565b602082015260055460405163eb7aac5f60e01b81526001600160a01b039091169063eb7aac5f9061135d908d906004016142d9565b60206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906142a5565b6040808301919091526002549051635670bcc760e11b81526001600160a01b039091169063ace1798e906113e5908d906004016142d9565b602060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143791906142a5565b6060820181905281516040830151600092611453928e92612b08565b905061146089828e612b22565b825161146d908d8d612bb3565b60a082018890528015801561149b57506001600160a01b038c1660009081526004602052604090205460ff16155b156114d5576114b4836000015184604001518a8c612c5d565b6080830181905260a08301516114cf9163ffffffff611aa116565b60a08301525b6114e28260a00151612e0e565b6114ef8260a001516124db565b60c083018190526114fc57fe5b6115148a8360c0015184606001518560400151612e37565b60e083015260c0820151604083015161152e918c91612e82565b61010083015280156115515761154c8260e001518360000151612ec8565b611594565b6115638260e001518360200151612ee8565b60006115828c8c60018660c00151600188606001518960400151612f08565b9050611592818460000151612f98565b505b82516001600160a01b0316638a25363c8d8d60016040518463ffffffff1660e01b81526004016115c693929190614307565b600060405180830381600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505084516040516322cbc1b360e11b81526001600160a01b0390911692506345978366915061162b908f908f908f90600401614307565b602060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167d91906142a5565b5082600001516001600160a01b031663fe4b0df68d8d8560c001516040518463ffffffff1660e01b81526004016116b693929190614307565b602060405180830381600087803b1580156116d057600080fd5b505af11580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170891906142a5565b50825160405163c7a1bbdb60e01b81526001600160a01b039091169063c7a1bbdb9061173a908f908f906004016142ed565b600060405180830381600087803b15801561175457600080fd5b505af1158015611768573d6000803e3d6000fd5b5050845160405163dbe9f91960e01b81526001600160a01b03909116925063dbe9f919915061179d908f908f906004016142ed565b602060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef91906142a5565b82610120018181525050600c60009054906101000a90046001600160a01b03166001600160a01b0316637c933c0a8c8e8561010001518b8b6040518663ffffffff1660e01b815260040161184795949392919061432b565b6040805180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190613e7f565b6001600160a01b039081166101808501529081166101608401528351604051630706bdff60e11b8152911690630e0d7bfe906118da908f908f906004016142ed565b602060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192c91906142a5565b61014083018190526040516001600160a01b038e16917fc78aeff453faf39d5a4a56acb99641aa471118956e00bdf4ca3e08ee6687fef69161196f918f916143b6565b60405180910390a26119926001600160a01b038c1633308d63ffffffff612fb816565b6119a183602001518c8c613010565b6119bb836020015184604001518d338c8760a00151613086565b602083015160408401516007546119e89291908e906001600160a01b0316678ac7230489e8000080613086565b8b6001600160a01b03167f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec18c8460c001518d8661012001516000604051611a33959493929190614378565b60405180910390a28b6001600160a01b03167fc124a8aee2d1e87da7bdee4cd86125637943b6ab32894b8ab8f83543beabf7428c8460800151604051611a7a9291906143b6565b60405180910390a28161016001518261018001519450945050505097509795505050505050565b600082820183811015611ac65760405162461bcd60e51b815260040161083190614497565b9392505050565b6040516370a0823160e01b815281906001600160a01b038416906370a0823190611afb9087906004016142d9565b60206040518083038186803b158015611b1357600080fd5b505afa158015611b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4b91906142a5565b1015611b695760405162461bcd60e51b8152600401610831906144ce565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e90611b9990879030906004016142ed565b60206040518083038186803b158015611bb157600080fd5b505afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be991906142a5565b1015611c075760405162461bcd60e51b815260040161083190614938565b505050565b600080611c17613cdc565b50604080516060810182526006546001600160a01b03908116825260005481166020830152600b541691810191909152611c4f613d76565b600554602086015160405163453ebeb560e11b81526001600160a01b0390921691638a7d7d6a91611c82916004016142d9565b60206040518083038186803b158015611c9a57600080fd5b505afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd291906142a5565b815260055460208601516040516311e2c60b60e11b81526001600160a01b03909216916323c58c1691611d07916004016142d9565b60206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5791906142a5565b6020808301919091526005549086015160405163eb7aac5f60e01b81526001600160a01b039092169163eb7aac5f91611d92916004016142d9565b60206040518083038186803b158015611daa57600080fd5b505afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de291906142a5565b60408083019190915260025460208701519151635670bcc760e11b81526001600160a01b039091169163ace1798e91611e1e91906004016142d9565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7091906142a5565b60608201819052602086015182516040840151600093611e9293929091612b08565b90508560c0015115611ebe57611eb18660400151828860000151612b22565b611ebe8660a00151613142565b611ed086606001518760800151613162565b611ee7866060015187608001518860a00151613189565b825186516020880151611efb9291906131bc565b85516001600160a01b0316331480611f1d5750600d546001600160a01b031633145b611f2357fe5b82518651602088015160405163df4fb9ef60e01b81526001600160a01b039093169263df4fb9ef92611f599290916004016142ed565b600060405180830381600087803b158015611f7357600080fd5b505af1158015611f87573d6000803e3d6000fd5b50505050611f9d8660600151876080015161325f565b151560c080850191909152608084019190915260a080880151908401528601518015611fc7575080155b8015611fed575085516001600160a01b031660009081526004602052604090205460ff16155b156120305761200e836000015184604001518860a001518960400151612c5d565b610180830181905260a083015161202a9163ffffffff611aa116565b60a08301525b825186516020880151604051631e7c58c160e31b81526001600160a01b039093169263f3e2c608926120669290916004016142ed565b60206040518083038186803b15801561207e57600080fd5b505afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b691906142a5565b60e083015282518651602088015160405163305a536960e01b81526001600160a01b039093169263305a5369926120f19290916004016142ed565b60206040518083038186803b15801561210957600080fd5b505afa15801561211d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214191906142a5565b610100830181905260e08301516060840151604085015161216493929190612e37565b8261012001818152505061219f8261010001518360e0015184608001518560c001518660a001518b60c001518860600151896040015161327e565b610140830152610100820151608087015111156121b857fe5b6121d181876020015188608001518960c00151866132b3565b8560c001511580156121e7575060008660a00151115b1561223a576122156122108360a001516122048560e0015161333e565b9063ffffffff61335816565b612e0e565b6122278260e001518360a0015161339a565b61223a8360400151338460a001516133d1565b61226583600001518760000151886020015185608001518660c001518760a001518c60c0015161346d565b6101a08401526101c083015282518651602088015160405163dbe9f91960e01b81526001600160a01b039093169263dbe9f919926122a79290916004016142ed565b602060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f991906142a5565b826101e001818152505060006123318361010001518460e0015185608001518660c001518760a001518c60c0015189604001516136a3565b600c54885160208a015160e08b01516101008c015160405163bc9b5bd560e01b81529596506001600160a01b039094169463bc9b5bd59461237b949392889290919060040161432b565b6040805180830381600087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190613e7f565b6001600160a01b03908116610220860152908116610200850152875160208901516101a08601516101c08701516101e088015160405194909516947f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec1946124399493929190600290614378565b60405180910390a286600001516001600160a01b03167fc124a8aee2d1e87da7bdee4cd86125637943b6ab32894b8ab8f83543beabf74288602001518561018001516040516124899291906143b6565b60405180910390a26124c284602001518560400151338a6020015187608001518860c001518d60a001518e60c001518b60a001516136c7565b8261020001518361022001519550955050505050915091565b600061073882678ac7230489e8000063ffffffff611aa116565b600654600054600b546001600160a01b0392831692918216911661251a8386866131bc565b60055460405163453ebeb560e11b81526000916001600160a01b031690638a7d7d6a9061254b9088906004016142d9565b60206040518083038186803b15801561256357600080fd5b505afa158015612577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259b91906142a5565b60055460405163eb7aac5f60e01b81529192506000916001600160a01b039091169063eb7aac5f906125d19089906004016142d9565b60206040518083038186803b1580156125e957600080fd5b505afa1580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262191906142a5565b600254604051635670bcc760e11b81529192506000916001600160a01b039091169063ace1798e90612657908a906004016142d9565b602060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a991906142a5565b90506126b78782858561378c565b60405163df4fb9ef60e01b81526001600160a01b0387169063df4fb9ef906126e5908b908b906004016142ed565b600060405180830381600087803b1580156126ff57600080fd5b505af1158015612713573d6000803e3d6000fd5b505060405163305a536960e01b8152600092506001600160a01b038916915063305a536990612748908c908c906004016142ed565b60206040518083038186803b15801561276057600080fd5b505afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279891906142a5565b90506000876001600160a01b031663f3e2c6088b8b6040518363ffffffff1660e01b81526004016127ca9291906142ed565b60206040518083038186803b1580156127e257600080fd5b505afa1580156127f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281a91906142a5565b905061283e863361283984678ac7230489e8000063ffffffff61335816565b6133d1565b60006128518a846000856000898b612f08565b905061285d8187612f98565b604051633ed3a18f60e21b81526001600160a01b038a169063fb4e863c9061288b908e908e906004016142ed565b600060405180830381600087803b1580156128a557600080fd5b505af11580156128b9573d6000803e3d6000fd5b50506040516331088bdb60e11b81526001600160a01b038c16925063621117b691506128ee908e908e90600290600401614307565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050508a6001600160a01b03167f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec18b60008060006001604051612964959493929190614378565b60405180910390a261299088888c3361298b87678ac7230489e8000063ffffffff61335816565b6137b5565b6007546129b490899089908d906001600160a01b0316678ac7230489e800006137b5565b60405163715aa61b60e01b81526001600160a01b0389169063715aa61b906129e4908d9033908890600401614307565b600060405180830381600087803b1580156129fe57600080fd5b505af1158015612a12573d6000803e3d6000fd5b505050505050505050505050505050565b3390565b6001600160a01b038116612a4d5760405162461bcd60e51b81526004016108319061466c565b803b806107655760405162461bcd60e51b815260040161083190614aed565b600554604051630658339960e51b81526001600160a01b039091169063cb06732090612a9c9084906004016142d9565b60206040518083038186803b158015612ab457600080fd5b505afa158015612ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aec91906141cc565b6110d45760405162461bcd60e51b815260040161083190614894565b600080612b16868685613871565b90931195945050505050565b8180612b4657506001600160a01b03811660009081526004602052604090205460ff165b15612b7857670de0b6b3a7640000831115612b735760405162461bcd60e51b8152600401610831906146a3565b611c07565b6611c37937e080008310801590612b975750670de0b6b3a76400008311155b611c075760405162461bcd60e51b815260040161083190614bd5565b60405163614d120960e01b81526000906001600160a01b0385169063614d120990612be490869086906004016142ed565b60206040518083038186803b158015612bfc57600080fd5b505afa158015612c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3491906142a5565b90506001811415612c575760405162461bcd60e51b815260040161083190614c25565b50505050565b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c9a57600080fd5b505af1158015612cae573d6000803e3d6000fd5b5050604051630631203b60e41b8152600092506001600160a01b038816915063631203b090612ce1908790600401614d4d565b60206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3191906142a5565b9050612d3e8185856138a2565b600954604051634677ffb360e01b81526001600160a01b0390911690634677ffb390612d6e908490600401614d4d565b600060405180830381600087803b158015612d8857600080fd5b505af1158015612d9c573d6000803e3d6000fd5b5050600a546040516340c10f1960e01b81526001600160a01b03808a1694506340c10f199350612dd292169085906004016143b6565b600060405180830381600087803b158015612dec57600080fd5b505af1158015612e00573d6000803e3d6000fd5b509298975050505050505050565b6804e1003b28d92800008110156110d45760405162461bcd60e51b815260040161083190614a90565b60008315612e79576000612e4b86846138e2565b90506000612e6f86612e63848863ffffffff61392a16565b9063ffffffff61396416565b92506105f0915050565b506000196105f0565b60008215612ebd576000612e9685846138e2565b9050612eb584612e638368056bc75e2d6310000063ffffffff61392a16565b915050611ac6565b506000199392505050565b808210156107655760405162461bcd60e51b81526004016108319061460f565b808210156107655760405162461bcd60e51b815260040161083190614a21565b600080612f1489610f17565b90506000612f218a6104d7565b905087612f3d57612f38828a63ffffffff61335816565b612f4d565b612f4d828a63ffffffff611aa116565b915085612f6957612f64818863ffffffff61335816565b612f79565b612f79818863ffffffff611aa116565b90506000612f8983838888612e37565b9b9a5050505050505050505050565b808210156107655760405162461bcd60e51b8152600401610831906147a2565b612c57846323b872dd60e01b858585604051602401612fd993929190614307565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139a6565b61302a6001600160a01b038316848363ffffffff613a3516565b604051630eb13cd160e41b81526001600160a01b0384169063eb13cd109061305890859085906004016143b6565b600060405180830381600087803b15801561307257600080fd5b505af11580156107e9573d6000803e3d6000fd5b604051630bf8f6bd60e31b81526001600160a01b03871690635fc7b5e8906130b490879085906004016143b6565b600060405180830381600087803b1580156130ce57600080fd5b505af11580156130e2573d6000803e3d6000fd5b50506040516340c10f1960e01b81526001600160a01b03881692506340c10f19915061311490869086906004016143b6565b600060405180830381600087803b15801561312e57600080fd5b505af11580156109bc573d6000803e3d6000fd5b600081116110d45760405162461bcd60e51b815260040161083190614c5c565b81158061316d575080155b6107655760405162461bcd60e51b815260040161083190614562565b8215158061319657508115155b806131a057508015155b611c075760405162461bcd60e51b8152600401610831906146f5565b60405163614d120960e01b81526000906001600160a01b0385169063614d1209906131ed90869086906004016142ed565b60206040518083038186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323d91906142a5565b905060018114612c575760405162461bcd60e51b815260040161083190614846565b600080831561327357508290506001613277565b8291505b9250929050565b60008060006132918b8b8b8b8b8b613ae6565b9150915060006132a383838888612e37565b9c9b505050505050505050505050565b84156132f4576132c283613b52565b81156132ef576132db8161014001518260000151612ec8565b6132ef816101400151826101200151613b70565b610e8f565b6133078161014001518260200151612ee8565b61332a8482608001518360c001518460a001518686606001518760400151612f08565b61016082018190528151610e8f9190612f98565b600061073882678ac7230489e8000063ffffffff61335816565b6000611ac683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b90565b6133b282678ac7230489e8000063ffffffff61335816565b8111156107655760405162461bcd60e51b815260040161083190614b22565b6040516370a0823160e01b815281906001600160a01b038516906370a08231906133ff9086906004016142d9565b60206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f91906142a5565b1015611c075760405162461bcd60e51b8152600401610831906149c4565b6000806000856134fd57604051622fae7760e81b81526001600160a01b038b1690632fae7700906134a6908c908c908c90600401614307565b602060405180830381600087803b1580156134c057600080fd5b505af11580156134d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f891906142a5565b61357f565b6040516322cbc1b360e11b81526001600160a01b038b169063459783669061352d908c908c908c90600401614307565b602060405180830381600087803b15801561354757600080fd5b505af115801561355b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357f91906142a5565b905060008461360f57604051634231d8b560e11b81526001600160a01b038c1690638463b16a906135b8908d908d908b90600401614307565b602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360a91906142a5565b613691565b604051637f2586fb60e11b81526001600160a01b038c169063fe4b0df69061363f908d908d908b90600401614307565b602060405180830381600087803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369191906142a5565b919b919a509098505050505050505050565b60008060006136b68a8a8a8a8a8a613ae6565b915091506000612f89838387612e82565b81156136e0576136db8989888a8786613086565b6136ed565b6136ed8989888a876137b5565b831561371e5761370e6001600160a01b03871633308863ffffffff612fb816565b613719898787613010565b613781565b60405163715aa61b60e01b81526001600160a01b038a169063715aa61b9061374e9089908b908a90600401614307565b600060405180830381600087803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050505b505050505050505050565b61379884848484612b08565b15612c575760405162461bcd60e51b8152600401610831906145b2565b604051633aacc81560e01b81526001600160a01b03861690633aacc815906137e390869085906004016143b6565b600060405180830381600087803b1580156137fd57600080fd5b505af1158015613811573d6000803e3d6000fd5b5050604051632770a7eb60e21b81526001600160a01b0387169250639dc29fac915061384390859085906004016143b6565b600060405180830381600087803b15801561385d57600080fd5b505af1158015613781573d6000803e3d6000fd5b60008061387d85610f17565b9050600061388a866104d7565b905061389882828787612e37565b9695505050505050565b60006138c083612e6386670de0b6b3a764000063ffffffff61392a16565b905081811115612c575760405162461bcd60e51b815260040161083190614d16565b81601282111561390a57613903816011198401600a0a63ffffffff61396416565b9050610738565b601282101561073857611ac6816012849003600a0a63ffffffff61392a16565b60008261393957506000610738565b8282028284828161394657fe5b0414611ac65760405162461bcd60e51b815260040161083190614761565b6000611ac683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bbc565b60606139fb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bf39092919063ffffffff16565b805190915015611c075780806020019051810190613a1991906141cc565b611c075760405162461bcd60e51b815260040161083190614b8b565b6000613ac582856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b8152600401613a699291906142ed565b60206040518083038186803b158015613a8157600080fd5b505afa158015613a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab991906142a5565b9063ffffffff611aa116565b9050612c578463095ea7b360e01b8584604051602401612fd99291906143b6565b600080878786613b0557613b008a8963ffffffff61335816565b613b15565b613b158a8963ffffffff611aa116565b915084613b3157613b2c898763ffffffff61335816565b613b41565b613b41898763ffffffff611aa116565b919a91995090975050505050505050565b80156110d45760405162461bcd60e51b8152600401610831906148db565b808210156107655760405162461bcd60e51b815260040161083190614cb9565b60008184841115613bb45760405162461bcd60e51b815260040161083191906143da565b505050900390565b60008183613bdd5760405162461bcd60e51b815260040161083191906143da565b506000838581613be957fe5b0495945050505050565b60606105f0848460008585613c0785613c9d565b613c235760405162461bcd60e51b81526004016108319061498d565b60006060866001600160a01b03168587604051613c4091906142bd565b60006040518083038185875af1925050503d8060008114613c7d576040519150601f19603f3d011682016040523d82523d6000602084013e613c82565b606091505b5091509150613c92828286613ca3565b979650505050505050565b3b151590565b60608315613cb2575081611ac6565b825115613cc25782518084602001fd5b8160405162461bcd60e51b815260040161083191906143da565b604080516060810182526000808252602082018190529181019190915290565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b60405180610240016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b803561073881614db3565b803561073881614dc8565b600060208284031215613e3c578081fd5b8135611ac681614db3565b60008060408385031215613e59578081fd5b8235613e6481614db3565b91506020830135613e7481614db3565b809150509250929050565b60008060408385031215613e91578182fd5b8251613e9c81614db3565b6020840151909250613e7481614db3565b60008060008060008060008060008060006101608c8e031215613ece578687fd5b8b35613ed981614db3565b9a5060208c0135613ee981614db3565b995060408c0135613ef981614db3565b985060608c0135613f0981614db3565b975060808c0135613f1981614db3565b965060a08c0135613f2981614db3565b955060c08c0135613f3981614db3565b945060e08c0135613f4981614db3565b9350613f598d6101008e01613e15565b9250613f698d6101208e01613e15565b9150613f798d6101408e01613e15565b90509295989b509295989b9093969950565b600080600080600080600060e0888a031215613fa5578283fd5b8735613fb081614db3565b96506020880135613fc081614db3565b955060408801359450606088013593506080880135925060a0880135613fe581614db3565b915060c0880135613ff581614db3565b8091505092959891949750929550565b60008060408385031215614017578182fd5b823561402281614db3565b91506020830135613e7481614dc8565b60008060008060808587031215614047578384fd5b843561405281614db3565b935060208501359250604085013561406981614db3565b9150606085013561407981614db3565b939692955090935050565b600080600080600060a0868803121561409b578081fd5b85356140a681614db3565b9450602086013593506040860135925060608601356140c481614db3565b915060808601356140d481614db3565b809150509295509295909350565b60008060008060008060c087890312156140fa578384fd5b863561410581614db3565b9550602087013594506040870135935060608701359250608087013561412a81614db3565b915060a087013561413a81614db3565b809150509295509295509295565b600080600080600080600080610100898b031215614164578182fd5b883561416f81614db3565b97506020890135965060408901359550606089013594506080890135935060a089013561419b81614dc8565b925060c08901356141ab81614db3565b915060e08901356141bb81614db3565b809150509295985092959890939650565b6000602082840312156141dd578081fd5b8151611ac681614dc8565b60006101208083850312156141fb578182fd5b61420481614d56565b61420e8585613e15565b815261421d8560208601613e15565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a08201526142578560c08601613e20565b60c08201526142698560e08601613e15565b60e0820152610100915061427f85838601613e15565b918101919091529392505050565b60006020828403121561429e578081fd5b5035919050565b6000602082840312156142b6578081fd5b5051919050565b600082516142cf818460208701614d7d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0395861681529385166020850152604084019290925283166060830152909116608082015260a00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b038616815260208101859052604081018490526060810183905260a081016143a683614da9565b8260808301529695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282518060208401526143f9816040850160208701614d7d565b601f01601f19169190910160400192915050565b60208082526024908201527f426f72726f7765724f70733a2043616c6c6572206973206e6f74204c6576657260408201526330b3b2b960e11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526038908201527f426f72726f7765724f7065726174696f6e733a20496e73756666696369656e7460408201527f207573657220636f6c6c61746572616c2062616c616e63650000000000000000606082015260800190565b60208082526018908201527f43616e206f6e6c7920696e697469616c697a65206f6e63650000000000000000604082015260600190565b60208082526030908201527f426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686460408201526f1c985dc8185b99081859190818dbdb1b60821b606082015260800190565b60208082526039908201527f426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d6960408201527f7474656420647572696e67205265636f76657279204d6f646500000000000000606082015260800190565b60208082526037908201527f426f72726f7765724f70733a204f7065726174696f6e206d757374206c65617660408201527f652074726f7665207769746820494352203e3d20434352000000000000000000606082015260800190565b6020808252601e908201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604082015260600190565b60208082526032908201527f4d6178206665652070657263656e74616765206d757374206c657373207468616040820152716e206f7220657175616c20746f203130302560701b606082015260800190565b60208082526046908201527f426f72726f7765724f70733a205468657265206d75737420626520656974686560408201527f72206120636f6c6c61746572616c206368616e6765206f7220612064656274206060820152656368616e676560d01b608082015260a00190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526049908201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760408201527f6f756c6420726573756c7420696e20544352203c20434352206973206e6f74206060820152681c195c9b5a5d1d195960ba1b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697360408201526d1d081bdc881a5cc818db1bdcd95960921b606082015260800190565b60208082526027908201527f426f72726f7765724f70733a20496e76616c696420636f6c6c61746572616c206040820152666164647265737360c81b606082015260800190565b6020808252603e908201527f426f72726f7765724f70733a20436f6c6c61746572616c20776974686472617760408201527f616c206e6f74207065726d6974746564205265636f76657279204d6f64650000606082015260800190565b60208082526035908201527f426f72726f7765724f7065726174696f6e733a20496e73756666696369656e7460408201527420636f6c6c61746572616c20616c6c6f77616e636560581b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252603d908201527f426f72726f7765724f70733a2043616c6c657220646f65736e7420686176652060408201527f656e6f756768204c55534420746f206d616b652072657061796d656e74000000606082015260800190565b60208082526049908201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760408201527f6f756c6420726573756c7420696e20494352203c204d4352206973206e6f74206060820152681c195c9b5a5d1d195960ba1b608082015260a00190565b6020808252603a908201527f426f72726f7765724f70733a2054726f76652773206e65742064656274206d7560408201527f73742062652067726561746572207468616e206d696e696d756d000000000000606082015260800190565b6020808252818101527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604082015260600190565b60208082526043908201527f426f72726f7765724f70733a20416d6f756e7420726570616964206d7573742060408201527f6e6f74206265206c6172676572207468616e207468652054726f76652773206460608201526219589d60ea1b608082015260a00190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526030908201527f4d6178206665652070657263656e74616765206d75737420626520626574776560408201526f656e20302e352520616e64203130302560801b606082015260800190565b6020808252601c908201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604082015260600190565b60208082526037908201527f426f72726f7765724f70733a204465627420696e63726561736520726571756960408201527f726573206e6f6e2d7a65726f20646562744368616e6765000000000000000000606082015260800190565b6020808252603e908201527f426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f7560408201527f722054726f766527732049435220696e205265636f76657279204d6f64650000606082015260800190565b6020808252601d908201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614d7557600080fd5b604052919050565b60005b83811015614d98578181015183820152602001614d80565b83811115612c575750506000910152565b600381106110d457fe5b6001600160a01b03811681146110d457600080fd5b80151581146110d457600080fdfea2646970667358221220e609a75bca52d5b0920756e43aed3dc927878537eb3fb611f9e442a5e4a4f9e764736f6c634300060b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c8063741bef1a1161013b5780639e86d0c4116100b8578063b83f91a21161007c578063b83f91a214610447578063bedafd011461044f578063cbd138ae14610462578063f2fde38b14610475578063f92d3433146104885761023d565b80639e86d0c41461040f578063a20baee614610375578063a3a6401714610422578063a3f4df7e1461042a578063ae9187541461043f5761023d565b80637da0b1fa116100ff5780637da0b1fa146103c65780637f7dde4a146103d95780638235b284146103e157806386a3e59a146103f45780638da5cb5b146104075761023d565b8063741bef1a1461037d5780637439902114610385578063761ab22c1461039857806376b00ddd146103a05780637985c5e4146103b35761023d565b806349b010c5116101c95780635c0ab4de1161018d5780635c0ab4de1461033f5780635e66c921146103475780636de903ca1461035a578063715018a61461036d57806372fe25aa146103755761023d565b806349b010c5146102eb5780634eab22fe146102fe5780634ff814431461030657806358e4b73114610319578063595a59c51461032c5761023d565b80632e86bbd8116102105780632e86bbd8146102a95780633cc74225146102b15780633d83908a146102c65780634870dd9a146102ce57806348a4a39d146102d65761023d565b80630e41879c14610242578063158ef93e1461026c5780631bf435551461028157806327d04b3514610296575b600080fd5b610255610250366004613f8b565b610490565b6040516102639291906142ed565b60405180910390f35b6102746104ba565b60405161026391906143cf565b6102896104ca565b6040516102639190614d4d565b6102896102a4366004613e2b565b6104d7565b6102896105f8565b6102b9610604565b60405161026391906142d9565b6102b9610613565b610289610622565b6102e96102e4366004614032565b610627565b005b6102e96102f9366004614032565b6106ac565b6102b961071e565b61028961031436600461428d565b61072d565b610274610327366004613e2b565b61073e565b6102e961033a366004613e47565b610753565b6102b9610769565b6102e9610355366004614084565b610778565b6102e9610368366004613e2b565b6107f2565b6102e9610899565b610289610922565b6102b961092e565b6102e9610393366004614148565b61093d565b6102b96109c8565b6102556103ae3660046141e8565b6109d7565b6102e96103c1366004613ead565b610a11565b6102e96103d43660046140e2565b610e07565b6102b9610e20565b6102e96103ef366004613e2b565b610e2f565b6102e9610402366004614032565b610e96565b6102b9610f08565b61028961041d366004613e2b565b610f17565b6102b9610fce565b610432610fdd565b60405161026391906143da565b6102b961100b565b6102b961101a565b6102e961045d366004614005565b611029565b6102e9610470366004613e2b565b6110ca565b6102e9610483366004613e2b565b6110d7565b610289611198565b60008061049b6111a3565b6104aa898989898989896111cf565b9150915097509795505050505050565b600354600160a01b900460ff1681565b6804e1003b28d928000081565b60008054604051634b14fa8760e01b815282916001600160a01b031690634b14fa87906105089086906004016142d9565b60206040518083038186803b15801561052057600080fd5b505afa158015610534573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055891906142a5565b600154604051634b14fa8760e01b81529192506000916001600160a01b0390911690634b14fa879061058e9087906004016142d9565b60206040518083038186803b1580156105a657600080fd5b505afa1580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906142a5565b90506105f0828263ffffffff611aa116565b949350505050565b678ac7230489e8000081565b6001546001600160a01b031681565b6006546001600160a01b031681565b60c881565b610632338585611acd565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020018581526020016000815260200160008152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b505050505050565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020016000815260200185815260200160008152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b600d546001600160a01b031681565b6000610738826124db565b92915050565b60046020526000908152604090205460ff1681565b61075b6111a3565b61076582826124f5565b5050565b6005546001600160a01b031681565b6107e9604051806101200160405280336001600160a01b03168152602001876001600160a01b031681526020018681526020016000815260200160008152602001858152602001600115158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b50505050505050565b6107fa612a23565b6001600160a01b031661080b610f08565b6001600160a01b03161461083a5760405162461bcd60e51b815260040161083190614811565b60405180910390fd5b61084381612a27565b600d80546001600160a01b0319166001600160a01b0383161790556040517fc9756a8fae9697c5cc7e3a2607c8f757af9828833744213558e0e911366c66119061088e9083906142d9565b60405180910390a150565b6108a1612a23565b6001600160a01b03166108b2610f08565b6001600160a01b0316146108d85760405162461bcd60e51b815260040161083190614811565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b670de0b6b3a764000081565b6002546001600160a01b031681565b851561094e5761094e338988611acd565b6109bc604051806101200160405280336001600160a01b031681526020018a6001600160a01b031681526020018981526020018881526020018781526020018681526020018515158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b50505050505050505050565b600a546001600160a01b031681565b6000806109e26111a3565b6060830151156109ff576109ff3384602001518560600151611acd565b610a0883611c0c565b91509150915091565b610a19612a23565b6001600160a01b0316610a2a610f08565b6001600160a01b031614610a505760405162461bcd60e51b815260040161083190614811565b600354600160a01b900460ff1615610a7a5760405162461bcd60e51b81526004016108319061452b565b610a838b612a27565b610a8c8a612a27565b610a9589612a27565b610a9e88612a27565b610aa787612a27565b610ab086612a27565b610ab985612a27565b610ac284612a27565b610acb83612a27565b610ad482612a27565b610add81612a27565b600580546001600160a01b03199081166001600160a01b038e8116919091179092556006805482168d84161790556000805482168c84161790556001805482168b84161790556007805482168a8416179055600880548216898416179055600280548216888416179055600c80548216878416179055600b80548216868416179055600a805482168584169081179091556009805483169091179055600d80549091169183169190911790556040517f6a69409f44477d8556c3c8040edc75d9bc1b3dee7846f6045c0b99556fe7bc9190610bb9908d906142d9565b60405180910390a17f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a56788a604051610bf091906142d9565b60405180910390a17f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd88289604051610c2791906142d9565b60405180910390a17f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b88604051610c5e91906142d9565b60405180910390a17fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa087604051610c9591906142d9565b60405180910390a17fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d86604051610ccc91906142d9565b60405180910390a17f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db26485604051610d0391906142d9565b60405180910390a17f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe7880084604051610d3a91906142d9565b60405180910390a17f227eec0ec317af6ab1a9587ffa1c84332522eb4c583a908f89babc05f8f339bd83604051610d7191906142d9565b60405180910390a17f756ebc192164c295bba134b5aacd72cc7aff8098a670d1f0a5f6b3a0b4ce670782604051610da891906142d9565b60405180910390a17fc9756a8fae9697c5cc7e3a2607c8f757af9828833744213558e0e911366c661181604051610ddf91906142d9565b60405180910390a150506003805460ff60a01b1916600160a01b179055505050505050505050565b610e16338787878787876111cf565b5050505050505050565b6000546001600160a01b031681565b60085460405163ea16003f60e01b81526001600160a01b039091169063ea16003f90610e6190339085906004016142ed565b600060405180830381600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b5050505050565b6106a4604051806101200160405280336001600160a01b03168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001858152602001600015158152602001846001600160a01b03168152602001836001600160a01b0316815250611c0c565b6003546001600160a01b031690565b60008054604051639b56d6c960e01b815282916001600160a01b031690639b56d6c990610f489086906004016142d9565b60206040518083038186803b158015610f6057600080fd5b505afa158015610f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9891906142a5565b600154604051639b56d6c960e01b81529192506000916001600160a01b0390911690639b56d6c99061058e9087906004016142d9565b6009546001600160a01b031681565b60405180604001604052806012815260200171426f72726f7765724f7065726174696f6e7360701b81525081565b600c546001600160a01b031681565b600b546001600160a01b031681565b611031612a23565b6001600160a01b0316611042610f08565b6001600160a01b0316146110685760405162461bcd60e51b815260040161083190614811565b6001600160a01b03821660009081526004602052604090819020805460ff1916831515179055517f2293b760d6615c0f087e78599ce64d67197a7dba78cdd9e241f3cd23b46101f3906110be908490849061435d565b60405180910390a15050565b6110d433826124f5565b50565b6110df612a23565b6001600160a01b03166110f0610f08565b6001600160a01b0316146111165760405162461bcd60e51b815260040161083190614811565b6001600160a01b03811661113c5760405162461bcd60e51b815260040161083190614451565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6611c37937e0800081565b600d546001600160a01b031633146111cd5760405162461bcd60e51b81526004016108319061440d565b565b6000806111db88612a6c565b6111e6338989611acd565b6111ee613cdc565b50604080516060810182526006546001600160a01b03908116825260005481166020830152600b541691810191909152611226613cfc565b60055460405163453ebeb560e11b81526001600160a01b0390911690638a7d7d6a90611256908d906004016142d9565b60206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a691906142a5565b81526005546040516311e2c60b60e11b81526001600160a01b03909116906323c58c16906112d8908d906004016142d9565b60206040518083038186803b1580156112f057600080fd5b505afa158015611304573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132891906142a5565b602082015260055460405163eb7aac5f60e01b81526001600160a01b039091169063eb7aac5f9061135d908d906004016142d9565b60206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906142a5565b6040808301919091526002549051635670bcc760e11b81526001600160a01b039091169063ace1798e906113e5908d906004016142d9565b602060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143791906142a5565b6060820181905281516040830151600092611453928e92612b08565b905061146089828e612b22565b825161146d908d8d612bb3565b60a082018890528015801561149b57506001600160a01b038c1660009081526004602052604090205460ff16155b156114d5576114b4836000015184604001518a8c612c5d565b6080830181905260a08301516114cf9163ffffffff611aa116565b60a08301525b6114e28260a00151612e0e565b6114ef8260a001516124db565b60c083018190526114fc57fe5b6115148a8360c0015184606001518560400151612e37565b60e083015260c0820151604083015161152e918c91612e82565b61010083015280156115515761154c8260e001518360000151612ec8565b611594565b6115638260e001518360200151612ee8565b60006115828c8c60018660c00151600188606001518960400151612f08565b9050611592818460000151612f98565b505b82516001600160a01b0316638a25363c8d8d60016040518463ffffffff1660e01b81526004016115c693929190614307565b600060405180830381600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505084516040516322cbc1b360e11b81526001600160a01b0390911692506345978366915061162b908f908f908f90600401614307565b602060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167d91906142a5565b5082600001516001600160a01b031663fe4b0df68d8d8560c001516040518463ffffffff1660e01b81526004016116b693929190614307565b602060405180830381600087803b1580156116d057600080fd5b505af11580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170891906142a5565b50825160405163c7a1bbdb60e01b81526001600160a01b039091169063c7a1bbdb9061173a908f908f906004016142ed565b600060405180830381600087803b15801561175457600080fd5b505af1158015611768573d6000803e3d6000fd5b5050845160405163dbe9f91960e01b81526001600160a01b03909116925063dbe9f919915061179d908f908f906004016142ed565b602060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ef91906142a5565b82610120018181525050600c60009054906101000a90046001600160a01b03166001600160a01b0316637c933c0a8c8e8561010001518b8b6040518663ffffffff1660e01b815260040161184795949392919061432b565b6040805180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190613e7f565b6001600160a01b039081166101808501529081166101608401528351604051630706bdff60e11b8152911690630e0d7bfe906118da908f908f906004016142ed565b602060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192c91906142a5565b61014083018190526040516001600160a01b038e16917fc78aeff453faf39d5a4a56acb99641aa471118956e00bdf4ca3e08ee6687fef69161196f918f916143b6565b60405180910390a26119926001600160a01b038c1633308d63ffffffff612fb816565b6119a183602001518c8c613010565b6119bb836020015184604001518d338c8760a00151613086565b602083015160408401516007546119e89291908e906001600160a01b0316678ac7230489e8000080613086565b8b6001600160a01b03167f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec18c8460c001518d8661012001516000604051611a33959493929190614378565b60405180910390a28b6001600160a01b03167fc124a8aee2d1e87da7bdee4cd86125637943b6ab32894b8ab8f83543beabf7428c8460800151604051611a7a9291906143b6565b60405180910390a28161016001518261018001519450945050505097509795505050505050565b600082820183811015611ac65760405162461bcd60e51b815260040161083190614497565b9392505050565b6040516370a0823160e01b815281906001600160a01b038416906370a0823190611afb9087906004016142d9565b60206040518083038186803b158015611b1357600080fd5b505afa158015611b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4b91906142a5565b1015611b695760405162461bcd60e51b8152600401610831906144ce565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e90611b9990879030906004016142ed565b60206040518083038186803b158015611bb157600080fd5b505afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be991906142a5565b1015611c075760405162461bcd60e51b815260040161083190614938565b505050565b600080611c17613cdc565b50604080516060810182526006546001600160a01b03908116825260005481166020830152600b541691810191909152611c4f613d76565b600554602086015160405163453ebeb560e11b81526001600160a01b0390921691638a7d7d6a91611c82916004016142d9565b60206040518083038186803b158015611c9a57600080fd5b505afa158015611cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd291906142a5565b815260055460208601516040516311e2c60b60e11b81526001600160a01b03909216916323c58c1691611d07916004016142d9565b60206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5791906142a5565b6020808301919091526005549086015160405163eb7aac5f60e01b81526001600160a01b039092169163eb7aac5f91611d92916004016142d9565b60206040518083038186803b158015611daa57600080fd5b505afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de291906142a5565b60408083019190915260025460208701519151635670bcc760e11b81526001600160a01b039091169163ace1798e91611e1e91906004016142d9565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7091906142a5565b60608201819052602086015182516040840151600093611e9293929091612b08565b90508560c0015115611ebe57611eb18660400151828860000151612b22565b611ebe8660a00151613142565b611ed086606001518760800151613162565b611ee7866060015187608001518860a00151613189565b825186516020880151611efb9291906131bc565b85516001600160a01b0316331480611f1d5750600d546001600160a01b031633145b611f2357fe5b82518651602088015160405163df4fb9ef60e01b81526001600160a01b039093169263df4fb9ef92611f599290916004016142ed565b600060405180830381600087803b158015611f7357600080fd5b505af1158015611f87573d6000803e3d6000fd5b50505050611f9d8660600151876080015161325f565b151560c080850191909152608084019190915260a080880151908401528601518015611fc7575080155b8015611fed575085516001600160a01b031660009081526004602052604090205460ff16155b156120305761200e836000015184604001518860a001518960400151612c5d565b610180830181905260a083015161202a9163ffffffff611aa116565b60a08301525b825186516020880151604051631e7c58c160e31b81526001600160a01b039093169263f3e2c608926120669290916004016142ed565b60206040518083038186803b15801561207e57600080fd5b505afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b691906142a5565b60e083015282518651602088015160405163305a536960e01b81526001600160a01b039093169263305a5369926120f19290916004016142ed565b60206040518083038186803b15801561210957600080fd5b505afa15801561211d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214191906142a5565b610100830181905260e08301516060840151604085015161216493929190612e37565b8261012001818152505061219f8261010001518360e0015184608001518560c001518660a001518b60c001518860600151896040015161327e565b610140830152610100820151608087015111156121b857fe5b6121d181876020015188608001518960c00151866132b3565b8560c001511580156121e7575060008660a00151115b1561223a576122156122108360a001516122048560e0015161333e565b9063ffffffff61335816565b612e0e565b6122278260e001518360a0015161339a565b61223a8360400151338460a001516133d1565b61226583600001518760000151886020015185608001518660c001518760a001518c60c0015161346d565b6101a08401526101c083015282518651602088015160405163dbe9f91960e01b81526001600160a01b039093169263dbe9f919926122a79290916004016142ed565b602060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f991906142a5565b826101e001818152505060006123318361010001518460e0015185608001518660c001518760a001518c60c0015189604001516136a3565b600c54885160208a015160e08b01516101008c015160405163bc9b5bd560e01b81529596506001600160a01b039094169463bc9b5bd59461237b949392889290919060040161432b565b6040805180830381600087803b15801561239457600080fd5b505af11580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190613e7f565b6001600160a01b03908116610220860152908116610200850152875160208901516101a08601516101c08701516101e088015160405194909516947f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec1946124399493929190600290614378565b60405180910390a286600001516001600160a01b03167fc124a8aee2d1e87da7bdee4cd86125637943b6ab32894b8ab8f83543beabf74288602001518561018001516040516124899291906143b6565b60405180910390a26124c284602001518560400151338a6020015187608001518860c001518d60a001518e60c001518b60a001516136c7565b8261020001518361022001519550955050505050915091565b600061073882678ac7230489e8000063ffffffff611aa116565b600654600054600b546001600160a01b0392831692918216911661251a8386866131bc565b60055460405163453ebeb560e11b81526000916001600160a01b031690638a7d7d6a9061254b9088906004016142d9565b60206040518083038186803b15801561256357600080fd5b505afa158015612577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259b91906142a5565b60055460405163eb7aac5f60e01b81529192506000916001600160a01b039091169063eb7aac5f906125d19089906004016142d9565b60206040518083038186803b1580156125e957600080fd5b505afa1580156125fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262191906142a5565b600254604051635670bcc760e11b81529192506000916001600160a01b039091169063ace1798e90612657908a906004016142d9565b602060405180830381600087803b15801561267157600080fd5b505af1158015612685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a991906142a5565b90506126b78782858561378c565b60405163df4fb9ef60e01b81526001600160a01b0387169063df4fb9ef906126e5908b908b906004016142ed565b600060405180830381600087803b1580156126ff57600080fd5b505af1158015612713573d6000803e3d6000fd5b505060405163305a536960e01b8152600092506001600160a01b038916915063305a536990612748908c908c906004016142ed565b60206040518083038186803b15801561276057600080fd5b505afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279891906142a5565b90506000876001600160a01b031663f3e2c6088b8b6040518363ffffffff1660e01b81526004016127ca9291906142ed565b60206040518083038186803b1580156127e257600080fd5b505afa1580156127f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281a91906142a5565b905061283e863361283984678ac7230489e8000063ffffffff61335816565b6133d1565b60006128518a846000856000898b612f08565b905061285d8187612f98565b604051633ed3a18f60e21b81526001600160a01b038a169063fb4e863c9061288b908e908e906004016142ed565b600060405180830381600087803b1580156128a557600080fd5b505af11580156128b9573d6000803e3d6000fd5b50506040516331088bdb60e11b81526001600160a01b038c16925063621117b691506128ee908e908e90600290600401614307565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050508a6001600160a01b03167f100d2512a463b515ea8d03a69afbcc791f1bd9139132e820631bec236f524ec18b60008060006001604051612964959493929190614378565b60405180910390a261299088888c3361298b87678ac7230489e8000063ffffffff61335816565b6137b5565b6007546129b490899089908d906001600160a01b0316678ac7230489e800006137b5565b60405163715aa61b60e01b81526001600160a01b0389169063715aa61b906129e4908d9033908890600401614307565b600060405180830381600087803b1580156129fe57600080fd5b505af1158015612a12573d6000803e3d6000fd5b505050505050505050505050505050565b3390565b6001600160a01b038116612a4d5760405162461bcd60e51b81526004016108319061466c565b803b806107655760405162461bcd60e51b815260040161083190614aed565b600554604051630658339960e51b81526001600160a01b039091169063cb06732090612a9c9084906004016142d9565b60206040518083038186803b158015612ab457600080fd5b505afa158015612ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aec91906141cc565b6110d45760405162461bcd60e51b815260040161083190614894565b600080612b16868685613871565b90931195945050505050565b8180612b4657506001600160a01b03811660009081526004602052604090205460ff165b15612b7857670de0b6b3a7640000831115612b735760405162461bcd60e51b8152600401610831906146a3565b611c07565b6611c37937e080008310801590612b975750670de0b6b3a76400008311155b611c075760405162461bcd60e51b815260040161083190614bd5565b60405163614d120960e01b81526000906001600160a01b0385169063614d120990612be490869086906004016142ed565b60206040518083038186803b158015612bfc57600080fd5b505afa158015612c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3491906142a5565b90506001811415612c575760405162461bcd60e51b815260040161083190614c25565b50505050565b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c9a57600080fd5b505af1158015612cae573d6000803e3d6000fd5b5050604051630631203b60e41b8152600092506001600160a01b038816915063631203b090612ce1908790600401614d4d565b60206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3191906142a5565b9050612d3e8185856138a2565b600954604051634677ffb360e01b81526001600160a01b0390911690634677ffb390612d6e908490600401614d4d565b600060405180830381600087803b158015612d8857600080fd5b505af1158015612d9c573d6000803e3d6000fd5b5050600a546040516340c10f1960e01b81526001600160a01b03808a1694506340c10f199350612dd292169085906004016143b6565b600060405180830381600087803b158015612dec57600080fd5b505af1158015612e00573d6000803e3d6000fd5b509298975050505050505050565b6804e1003b28d92800008110156110d45760405162461bcd60e51b815260040161083190614a90565b60008315612e79576000612e4b86846138e2565b90506000612e6f86612e63848863ffffffff61392a16565b9063ffffffff61396416565b92506105f0915050565b506000196105f0565b60008215612ebd576000612e9685846138e2565b9050612eb584612e638368056bc75e2d6310000063ffffffff61392a16565b915050611ac6565b506000199392505050565b808210156107655760405162461bcd60e51b81526004016108319061460f565b808210156107655760405162461bcd60e51b815260040161083190614a21565b600080612f1489610f17565b90506000612f218a6104d7565b905087612f3d57612f38828a63ffffffff61335816565b612f4d565b612f4d828a63ffffffff611aa116565b915085612f6957612f64818863ffffffff61335816565b612f79565b612f79818863ffffffff611aa116565b90506000612f8983838888612e37565b9b9a5050505050505050505050565b808210156107655760405162461bcd60e51b8152600401610831906147a2565b612c57846323b872dd60e01b858585604051602401612fd993929190614307565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139a6565b61302a6001600160a01b038316848363ffffffff613a3516565b604051630eb13cd160e41b81526001600160a01b0384169063eb13cd109061305890859085906004016143b6565b600060405180830381600087803b15801561307257600080fd5b505af11580156107e9573d6000803e3d6000fd5b604051630bf8f6bd60e31b81526001600160a01b03871690635fc7b5e8906130b490879085906004016143b6565b600060405180830381600087803b1580156130ce57600080fd5b505af11580156130e2573d6000803e3d6000fd5b50506040516340c10f1960e01b81526001600160a01b03881692506340c10f19915061311490869086906004016143b6565b600060405180830381600087803b15801561312e57600080fd5b505af11580156109bc573d6000803e3d6000fd5b600081116110d45760405162461bcd60e51b815260040161083190614c5c565b81158061316d575080155b6107655760405162461bcd60e51b815260040161083190614562565b8215158061319657508115155b806131a057508015155b611c075760405162461bcd60e51b8152600401610831906146f5565b60405163614d120960e01b81526000906001600160a01b0385169063614d1209906131ed90869086906004016142ed565b60206040518083038186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323d91906142a5565b905060018114612c575760405162461bcd60e51b815260040161083190614846565b600080831561327357508290506001613277565b8291505b9250929050565b60008060006132918b8b8b8b8b8b613ae6565b9150915060006132a383838888612e37565b9c9b505050505050505050505050565b84156132f4576132c283613b52565b81156132ef576132db8161014001518260000151612ec8565b6132ef816101400151826101200151613b70565b610e8f565b6133078161014001518260200151612ee8565b61332a8482608001518360c001518460a001518686606001518760400151612f08565b61016082018190528151610e8f9190612f98565b600061073882678ac7230489e8000063ffffffff61335816565b6000611ac683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b90565b6133b282678ac7230489e8000063ffffffff61335816565b8111156107655760405162461bcd60e51b815260040161083190614b22565b6040516370a0823160e01b815281906001600160a01b038516906370a08231906133ff9086906004016142d9565b60206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f91906142a5565b1015611c075760405162461bcd60e51b8152600401610831906149c4565b6000806000856134fd57604051622fae7760e81b81526001600160a01b038b1690632fae7700906134a6908c908c908c90600401614307565b602060405180830381600087803b1580156134c057600080fd5b505af11580156134d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f891906142a5565b61357f565b6040516322cbc1b360e11b81526001600160a01b038b169063459783669061352d908c908c908c90600401614307565b602060405180830381600087803b15801561354757600080fd5b505af115801561355b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357f91906142a5565b905060008461360f57604051634231d8b560e11b81526001600160a01b038c1690638463b16a906135b8908d908d908b90600401614307565b602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061360a91906142a5565b613691565b604051637f2586fb60e11b81526001600160a01b038c169063fe4b0df69061363f908d908d908b90600401614307565b602060405180830381600087803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369191906142a5565b919b919a509098505050505050505050565b60008060006136b68a8a8a8a8a8a613ae6565b915091506000612f89838387612e82565b81156136e0576136db8989888a8786613086565b6136ed565b6136ed8989888a876137b5565b831561371e5761370e6001600160a01b03871633308863ffffffff612fb816565b613719898787613010565b613781565b60405163715aa61b60e01b81526001600160a01b038a169063715aa61b9061374e9089908b908a90600401614307565b600060405180830381600087803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050505b505050505050505050565b61379884848484612b08565b15612c575760405162461bcd60e51b8152600401610831906145b2565b604051633aacc81560e01b81526001600160a01b03861690633aacc815906137e390869085906004016143b6565b600060405180830381600087803b1580156137fd57600080fd5b505af1158015613811573d6000803e3d6000fd5b5050604051632770a7eb60e21b81526001600160a01b0387169250639dc29fac915061384390859085906004016143b6565b600060405180830381600087803b15801561385d57600080fd5b505af1158015613781573d6000803e3d6000fd5b60008061387d85610f17565b9050600061388a866104d7565b905061389882828787612e37565b9695505050505050565b60006138c083612e6386670de0b6b3a764000063ffffffff61392a16565b905081811115612c575760405162461bcd60e51b815260040161083190614d16565b81601282111561390a57613903816011198401600a0a63ffffffff61396416565b9050610738565b601282101561073857611ac6816012849003600a0a63ffffffff61392a16565b60008261393957506000610738565b8282028284828161394657fe5b0414611ac65760405162461bcd60e51b815260040161083190614761565b6000611ac683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bbc565b60606139fb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613bf39092919063ffffffff16565b805190915015611c075780806020019051810190613a1991906141cc565b611c075760405162461bcd60e51b815260040161083190614b8b565b6000613ac582856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b8152600401613a699291906142ed565b60206040518083038186803b158015613a8157600080fd5b505afa158015613a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab991906142a5565b9063ffffffff611aa116565b9050612c578463095ea7b360e01b8584604051602401612fd99291906143b6565b600080878786613b0557613b008a8963ffffffff61335816565b613b15565b613b158a8963ffffffff611aa116565b915084613b3157613b2c898763ffffffff61335816565b613b41565b613b41898763ffffffff611aa116565b919a91995090975050505050505050565b80156110d45760405162461bcd60e51b8152600401610831906148db565b808210156107655760405162461bcd60e51b815260040161083190614cb9565b60008184841115613bb45760405162461bcd60e51b815260040161083191906143da565b505050900390565b60008183613bdd5760405162461bcd60e51b815260040161083191906143da565b506000838581613be957fe5b0495945050505050565b60606105f0848460008585613c0785613c9d565b613c235760405162461bcd60e51b81526004016108319061498d565b60006060866001600160a01b03168587604051613c4091906142bd565b60006040518083038185875af1925050503d8060008114613c7d576040519150601f19603f3d011682016040523d82523d6000602084013e613c82565b606091505b5091509150613c92828286613ca3565b979650505050505050565b3b151590565b60608315613cb2575081611ac6565b825115613cc25782518084602001fd5b8160405162461bcd60e51b815260040161083191906143da565b604080516060810182526000808252602082018190529181019190915290565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b60405180610240016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b803561073881614db3565b803561073881614dc8565b600060208284031215613e3c578081fd5b8135611ac681614db3565b60008060408385031215613e59578081fd5b8235613e6481614db3565b91506020830135613e7481614db3565b809150509250929050565b60008060408385031215613e91578182fd5b8251613e9c81614db3565b6020840151909250613e7481614db3565b60008060008060008060008060008060006101608c8e031215613ece578687fd5b8b35613ed981614db3565b9a5060208c0135613ee981614db3565b995060408c0135613ef981614db3565b985060608c0135613f0981614db3565b975060808c0135613f1981614db3565b965060a08c0135613f2981614db3565b955060c08c0135613f3981614db3565b945060e08c0135613f4981614db3565b9350613f598d6101008e01613e15565b9250613f698d6101208e01613e15565b9150613f798d6101408e01613e15565b90509295989b509295989b9093969950565b600080600080600080600060e0888a031215613fa5578283fd5b8735613fb081614db3565b96506020880135613fc081614db3565b955060408801359450606088013593506080880135925060a0880135613fe581614db3565b915060c0880135613ff581614db3565b8091505092959891949750929550565b60008060408385031215614017578182fd5b823561402281614db3565b91506020830135613e7481614dc8565b60008060008060808587031215614047578384fd5b843561405281614db3565b935060208501359250604085013561406981614db3565b9150606085013561407981614db3565b939692955090935050565b600080600080600060a0868803121561409b578081fd5b85356140a681614db3565b9450602086013593506040860135925060608601356140c481614db3565b915060808601356140d481614db3565b809150509295509295909350565b60008060008060008060c087890312156140fa578384fd5b863561410581614db3565b9550602087013594506040870135935060608701359250608087013561412a81614db3565b915060a087013561413a81614db3565b809150509295509295509295565b600080600080600080600080610100898b031215614164578182fd5b883561416f81614db3565b97506020890135965060408901359550606089013594506080890135935060a089013561419b81614dc8565b925060c08901356141ab81614db3565b915060e08901356141bb81614db3565b809150509295985092959890939650565b6000602082840312156141dd578081fd5b8151611ac681614dc8565b60006101208083850312156141fb578182fd5b61420481614d56565b61420e8585613e15565b815261421d8560208601613e15565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a08201526142578560c08601613e20565b60c08201526142698560e08601613e15565b60e0820152610100915061427f85838601613e15565b918101919091529392505050565b60006020828403121561429e578081fd5b5035919050565b6000602082840312156142b6578081fd5b5051919050565b600082516142cf818460208701614d7d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0395861681529385166020850152604084019290925283166060830152909116608082015260a00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b038616815260208101859052604081018490526060810183905260a081016143a683614da9565b8260808301529695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282518060208401526143f9816040850160208701614d7d565b601f01601f19169190910160400192915050565b60208082526024908201527f426f72726f7765724f70733a2043616c6c6572206973206e6f74204c6576657260408201526330b3b2b960e11b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526038908201527f426f72726f7765724f7065726174696f6e733a20496e73756666696369656e7460408201527f207573657220636f6c6c61746572616c2062616c616e63650000000000000000606082015260800190565b60208082526018908201527f43616e206f6e6c7920696e697469616c697a65206f6e63650000000000000000604082015260600190565b60208082526030908201527f426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686460408201526f1c985dc8185b99081859190818dbdb1b60821b606082015260800190565b60208082526039908201527f426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d6960408201527f7474656420647572696e67205265636f76657279204d6f646500000000000000606082015260800190565b60208082526037908201527f426f72726f7765724f70733a204f7065726174696f6e206d757374206c65617660408201527f652074726f7665207769746820494352203e3d20434352000000000000000000606082015260800190565b6020808252601e908201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604082015260600190565b60208082526032908201527f4d6178206665652070657263656e74616765206d757374206c657373207468616040820152716e206f7220657175616c20746f203130302560701b606082015260800190565b60208082526046908201527f426f72726f7765724f70733a205468657265206d75737420626520656974686560408201527f72206120636f6c6c61746572616c206368616e6765206f7220612064656274206060820152656368616e676560d01b608082015260a00190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526049908201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760408201527f6f756c6420726573756c7420696e20544352203c20434352206973206e6f74206060820152681c195c9b5a5d1d195960ba1b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697360408201526d1d081bdc881a5cc818db1bdcd95960921b606082015260800190565b60208082526027908201527f426f72726f7765724f70733a20496e76616c696420636f6c6c61746572616c206040820152666164647265737360c81b606082015260800190565b6020808252603e908201527f426f72726f7765724f70733a20436f6c6c61746572616c20776974686472617760408201527f616c206e6f74207065726d6974746564205265636f76657279204d6f64650000606082015260800190565b60208082526035908201527f426f72726f7765724f7065726174696f6e733a20496e73756666696369656e7460408201527420636f6c6c61746572616c20616c6c6f77616e636560581b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252603d908201527f426f72726f7765724f70733a2043616c6c657220646f65736e7420686176652060408201527f656e6f756768204c55534420746f206d616b652072657061796d656e74000000606082015260800190565b60208082526049908201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760408201527f6f756c6420726573756c7420696e20494352203c204d4352206973206e6f74206060820152681c195c9b5a5d1d195960ba1b608082015260a00190565b6020808252603a908201527f426f72726f7765724f70733a2054726f76652773206e65742064656274206d7560408201527f73742062652067726561746572207468616e206d696e696d756d000000000000606082015260800190565b6020808252818101527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604082015260600190565b60208082526043908201527f426f72726f7765724f70733a20416d6f756e7420726570616964206d7573742060408201527f6e6f74206265206c6172676572207468616e207468652054726f76652773206460608201526219589d60ea1b608082015260a00190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526030908201527f4d6178206665652070657263656e74616765206d75737420626520626574776560408201526f656e20302e352520616e64203130302560801b606082015260800190565b6020808252601c908201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604082015260600190565b60208082526037908201527f426f72726f7765724f70733a204465627420696e63726561736520726571756960408201527f726573206e6f6e2d7a65726f20646562744368616e6765000000000000000000606082015260800190565b6020808252603e908201527f426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f7560408201527f722054726f766527732049435220696e205265636f76657279204d6f64650000606082015260800190565b6020808252601d908201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614d7557600080fd5b604052919050565b60005b83811015614d98578181015183820152602001614d80565b83811115612c575750506000910152565b600381106110d457fe5b6001600160a01b03811681146110d457600080fd5b80151581146110d457600080fdfea2646970667358221220e609a75bca52d5b0920756e43aed3dc927878537eb3fb611f9e442a5e4a4f9e764736f6c634300060b0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.