feat: Added configurator managing flashloan premiums

This commit is contained in:
Hadrien Charlanes 2021-06-10 19:05:50 +02:00
parent 39301ebee1
commit a6b71313e1
5 changed files with 77 additions and 14 deletions

View File

@ -471,4 +471,17 @@ interface ILendingPool {
function updateFlashBorrowerAuthorization(address flashBorrower, bool authorized) external; function updateFlashBorrowerAuthorization(address flashBorrower, bool authorized) external;
function isFlashBorrowerAuthorized(address flashBorrower) external view returns (bool); function isFlashBorrowerAuthorized(address flashBorrower) external view returns (bool);
function updateFlashloanPremiums(
uint256 flashLoanPremiumTotal,
uint256 flashLoanPremiumToProtocol
) external;
function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256);
function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint256);
function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint256);
function MAX_NUMBER_RESERVES() external view returns (uint256);
} }

View File

@ -233,6 +233,18 @@ interface ILendingPoolConfigurator {
**/ **/
event RiskAdminUnregistered(address indexed admin); event RiskAdminUnregistered(address indexed admin);
/**
* @dev Emitted when a the total premium on flashloans is updated
* @param flashloanPremiumTotal the new premium
**/
event FlashloanPremiumTotalUpdated(uint256 flashloanPremiumTotal);
/**
* @dev Emitted when a the part of the premium that goes to protoco lis updated
* @param flashloanPremiumToProtocol the new premium
**/
event FlashloanPremiumToProcolUpdated(uint256 flashloanPremiumToProtocol);
/** /**
* @dev Initializes reserves in batch * @dev Initializes reserves in batch
* @param input The array of reserves initialization parameters * @param input The array of reserves initialization parameters
@ -410,4 +422,8 @@ interface ILendingPoolConfigurator {
* @param asset the address of the reserve to drop * @param asset the address of the reserve to drop
**/ **/
function dropReserve(address asset) external; function dropReserve(address asset) external;
function updateFlashloanPremiumTotal(uint256 flashloanPremiumTotal) external;
function updateFlashloanPremiumToProtocol(uint256 flashloanPremiumToProtocol) external;
} }

View File

@ -87,9 +87,9 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
function initialize(ILendingPoolAddressesProvider provider) public initializer { function initialize(ILendingPoolAddressesProvider provider) public initializer {
_addressesProvider = provider; _addressesProvider = provider;
_maxStableRateBorrowSizePercent = 2500; _maxStableRateBorrowSizePercent = 2500;
_flashLoanPremiumToLP = 7; _flashLoanPremiumTotal = 9;
_maxNumberOfReserves = 128; _maxNumberOfReserves = 128;
_flashLoanPremiumToProtocol = 2; _flashLoanPremiumToProtocol = 0;
} }
/** /**
@ -437,7 +437,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
uint256 currentPremiumToProtocol; uint256 currentPremiumToProtocol;
uint256 currentAmountPlusPremium; uint256 currentAmountPlusPremium;
address debtToken; address debtToken;
uint256 flashloanPremiumToLP; uint256 flashloanPremiumTotal;
uint256 flashloanPremiumToProtocol; uint256 flashloanPremiumToProtocol;
} }
@ -474,19 +474,18 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
address[] memory aTokenAddresses = new address[](assets.length); address[] memory aTokenAddresses = new address[](assets.length);
uint256[] memory totalPremiums = new uint256[](assets.length); uint256[] memory totalPremiums = new uint256[](assets.length);
vars.receiver = IFlashLoanReceiver(receiverAddress); vars.receiver = IFlashLoanReceiver(receiverAddress);
(vars.flashloanPremiumToLP, vars.flashloanPremiumToProtocol) = _authorizedFlashBorrowers[ (vars.flashloanPremiumTotal, vars.flashloanPremiumToProtocol) = _authorizedFlashBorrowers[
msg.sender msg.sender
] ]
? (0, 0) ? (0, 0)
: (_flashLoanPremiumToLP, _flashLoanPremiumToProtocol); : (_flashLoanPremiumTotal, _flashLoanPremiumToProtocol);
for (vars.i = 0; vars.i < assets.length; vars.i++) { for (vars.i = 0; vars.i < assets.length; vars.i++) {
aTokenAddresses[vars.i] = _reserves[assets[vars.i]].aTokenAddress; aTokenAddresses[vars.i] = _reserves[assets[vars.i]].aTokenAddress;
vars.currentPremiumToLP = amounts[vars.i].percentMul(vars.flashloanPremiumToLP); totalPremiums[vars.i] = amounts[vars.i].percentMul(vars.flashloanPremiumTotal);
vars.currentPremiumToProtocol = amounts[vars.i].percentMul(vars.flashloanPremiumToProtocol); vars.currentPremiumToProtocol = amounts[vars.i].percentMul(vars.flashloanPremiumToProtocol);
vars.currentPremiumToLP = totalPremiums[vars.i].sub(vars.currentPremiumToProtocol);
totalPremiums[vars.i] = vars.currentPremiumToLP.add(vars.currentPremiumToProtocol);
IAToken(aTokenAddresses[vars.i]).transferUnderlyingTo(receiverAddress, amounts[vars.i]); IAToken(aTokenAddresses[vars.i]).transferUnderlyingTo(receiverAddress, amounts[vars.i]);
} }
@ -737,21 +736,28 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
/** /**
* @dev Returns the percentage of available liquidity that can be borrowed at once at stable rate * @dev Returns the percentage of available liquidity that can be borrowed at once at stable rate
*/ */
function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() public view returns (uint256) { function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() public view override returns (uint256) {
return _maxStableRateBorrowSizePercent; return _maxStableRateBorrowSizePercent;
} }
/** /**
* @dev Returns the fee on flash loans * @dev Returns the total fee on flash loans
*/ */
function FLASHLOAN_PREMIUM_TOTAL() public view returns (uint256) { function FLASHLOAN_PREMIUM_TOTAL() public view override returns (uint256) {
return _flashLoanPremiumToLP; return _flashLoanPremiumTotal;
}
/**
* @dev Returns the part of the flashloan fees sent to protocol
*/
function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view override returns (uint256) {
return _flashLoanPremiumToProtocol;
} }
/** /**
* @dev Returns the maximum number of reserves supported to be listed in this LendingPool * @dev Returns the maximum number of reserves supported to be listed in this LendingPool
*/ */
function MAX_NUMBER_RESERVES() public view returns (uint256) { function MAX_NUMBER_RESERVES() public view override returns (uint256) {
return _maxNumberOfReserves; return _maxNumberOfReserves;
} }
@ -899,6 +905,14 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
return _authorizedFlashBorrowers[flashBorrower]; return _authorizedFlashBorrowers[flashBorrower];
} }
function updateFlashloanPremiums(
uint256 flashLoanPremiumTotal,
uint256 flashLoanPremiumToProtocol
) external override onlyLendingPoolConfigurator {
_flashLoanPremiumTotal = flashLoanPremiumTotal;
_flashLoanPremiumToProtocol = flashLoanPremiumToProtocol;
}
struct ExecuteBorrowParams { struct ExecuteBorrowParams {
address asset; address asset;
address user; address user;

View File

@ -508,6 +508,26 @@ contract LendingPoolConfigurator is VersionedInitializable, ILendingPoolConfigur
return _riskAdmins[admin]; return _riskAdmins[admin];
} }
/// @inheritdoc ILendingPoolConfigurator
function updateFlashloanPremiumTotal(uint256 flashloanPremiumTotal)
external
override
onlyPoolAdmin
{
_pool.updateFlashloanPremiums(flashloanPremiumTotal, _pool.FLASHLOAN_PREMIUM_TO_PROTOCOL());
emit FlashloanPremiumTotalUpdated(flashloanPremiumTotal);
}
/// @inheritdoc ILendingPoolConfigurator
function updateFlashloanPremiumToProtocol(uint256 flashloanPremiumToProtocol)
external
override
onlyPoolAdmin
{
_pool.updateFlashloanPremiums(_pool.FLASHLOAN_PREMIUM_TOTAL(), flashloanPremiumToProtocol);
emit FlashloanPremiumToProcolUpdated(flashloanPremiumToProtocol);
}
function _initTokenWithProxy(address implementation, bytes memory initParams) function _initTokenWithProxy(address implementation, bytes memory initParams)
internal internal
returns (address) returns (address)

View File

@ -26,7 +26,7 @@ contract LendingPoolStorage {
uint256 internal _maxStableRateBorrowSizePercent; uint256 internal _maxStableRateBorrowSizePercent;
uint256 internal _flashLoanPremiumToLP; uint256 internal _flashLoanPremiumTotal;
uint256 internal _maxNumberOfReserves; uint256 internal _maxNumberOfReserves;