Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ jobs:
'src/contracts/helpers/UiIncentiveDataProviderV3.sol' \
'src/contracts/helpers/UiPoolDataProviderV3.sol' \
'src/contracts/helpers/WalletBalanceProvider.sol' \
'src/contracts/dependencies/*'
'src/contracts/dependencies/*' \
'src/contracts/instances/PoolInstance.sol' \
'src/contracts/instances/VariableDebtTokenMainnetInstanceGHO.sol' \
'src/contracts/instances/PoolConfiguratorInstance.sol'

- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@ea99328d1c4d5f39fda7cbffe104afd6906c50b0
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

![Aave v3.1 Origin_banner](./resources/v3-1-banner.jpeg)

Aave v3.3 complete codebase, Foundry-based.
Aave v3.5 complete codebase, Foundry-based.

[![codecov](https://codecov.io/gh/aave-dao/aave-v3-origin/graph/badge.svg?token=6HX4NXCNIQ)](https://codecov.io/gh/aave-dao/aave-v3-origin)
<br>
Expand All @@ -18,8 +18,10 @@ If you're interested in contributing, please read the [contributing docs](/.gith
- [Aave v3 technical Paper](./docs/Aave_V3_Technical_Paper.pdf)
- [v3 to v3.0.2 production upgrade](https://github.com/bgd-labs/proposal-3.0.2-upgrade/blob/main/README.md)
- [Aave v3.1 features](./docs/3.1/Aave-v3.1-features.md)
- [Aave v3.2 features](./docs/3.2/Aave-3.2-features.md)
- [Aave v3.2 features](./docs/3.2/Aave-v3.2-features.md)
- [Aave v3.3 features](./docs/3.3/Aave-v3.3-features.md)
- [Aave v3.4 features](./docs/3.3/Aave-v3.4-features.md)
- [Aave v3.5 features](./docs/3.3/Aave-v3.5-features.md)
- [v3.1 to v3.2 production upgrade](https://github.com/bgd-labs/protocol-3.2.0-upgrade/blob/main/README.md)
- [v3.2 to v3.3 production upgrade](https://github.com/bgd-labs/protocol-3.3.0-upgrade/blob/main/README.md)
- [Set Ltv to 0 on Freeze Feature State diagram](./docs/freeze-ltv0-states.png)
Expand Down
File renamed without changes.
3 changes: 3 additions & 0 deletions snapshots/ProtocolDataProvider.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
{
"getATokenTotalSupply": "30080",
"getAllATokens": "63841",
"getAllReservesTokens": "43072",
"getFlashLoanEnabled": "11346",
"getInterestRateStrategyAddress": "8811",
"getIsVirtualAccActive": "463",
"getLiquidationProtocolFee": "11373",
"getPaused": "11462",
"getReserveCaps": "11383",
"getReserveConfigurationData": "11819",
"getReserveDeficit": "10973",
"getReserveTokensAddresses": "14934",
"getSiloedBorrowing": "11399",
"getTotalDebt": "30080",
Expand Down
10 changes: 0 additions & 10 deletions src/contracts/protocol/libraries/math/WadRayMath.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,6 @@ library WadRayMath {
}
}

function rayMul(uint256 a, uint256 b, Rounding rounding) internal pure returns (uint256 c) {
if (rounding == Rounding.Floor) return rayMulFloor(a, b);
return rayMulCeil(a, b);
}

function rayMulFloor(uint256 a, uint256 b) internal pure returns (uint256 c) {
assembly {
// Overflow check: Ensure a * b does not exceed uint256 max
Expand Down Expand Up @@ -116,11 +111,6 @@ library WadRayMath {
}
}

function rayDiv(uint256 a, uint256 b, Rounding rounding) internal pure returns (uint256 c) {
if (rounding == Rounding.Floor) return rayDivFloor(a, b);
return rayDivCeil(a, b);
}

function rayDivCeil(uint256 a, uint256 b) internal pure returns (uint256 c) {
assembly {
// Overflow check: Ensure a * RAY does not exceed uint256 max
Expand Down
21 changes: 21 additions & 0 deletions tests/gas/ProtocolDataProvider.gas.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,27 @@ contract ProtocolDataProvider_gas_Tests is Testhelpers {
vm.snapshotGasLastCall('ProtocolDataProvider', 'getReserveConfigurationData');
}

function test_getAllReservesTokens() external {
contracts.protocolDataProvider.getAllReservesTokens();
vm.snapshotGasLastCall('ProtocolDataProvider', 'getAllReservesTokens');
}

function test_getAllATokens() external {
contracts.protocolDataProvider.getAllATokens();
vm.snapshotGasLastCall('ProtocolDataProvider', 'getAllATokens');
}

// breaks coverage due to stack to deep
// function test_getReserveData() external {
// contracts.protocolDataProvider.getReserveData(tokenList.usdx);
// vm.snapshotGasLastCall('ProtocolDataProvider', 'getReserveData');
// }

function test_getReserveDeficit() external {
contracts.protocolDataProvider.getReserveDeficit(tokenList.usdx);
vm.snapshotGasLastCall('ProtocolDataProvider', 'getReserveDeficit');
}

function test_getReserveCaps() external {
contracts.protocolDataProvider.getReserveCaps(tokenList.usdx);
vm.snapshotGasLastCall('ProtocolDataProvider', 'getReserveCaps');
Expand Down
11 changes: 3 additions & 8 deletions tests/invariants/base/BaseTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,8 @@ abstract contract BaseTest is BaseStorage, PropertiesConstants, StdAsserts, StdU
uint256 scaledATokenTotalSupply = IAToken(protocolTokens[asset].aTokenAddress)
.scaledTotalSupply();

totalSupply = (scaledATokenTotalSupply + pool.getReserveData(asset).accruedToTreasury).rayMul(
_getReserveNormalizedIncome(asset),
WadRayMath.Rounding.Floor
);
totalSupply = (scaledATokenTotalSupply + pool.getReserveData(asset).accruedToTreasury)
.rayMulFloor(_getReserveNormalizedIncome(asset));
}

function _getRealTotalSupply(
Expand All @@ -163,10 +161,7 @@ abstract contract BaseTest is BaseStorage, PropertiesConstants, StdAsserts, StdU
uint256 accruedToTreasury
) internal view returns (uint256) {
return
(scaledATokenTotalSupply + accruedToTreasury).rayMul(
_getReserveNormalizedIncome(asset),
WadRayMath.Rounding.Floor
);
(scaledATokenTotalSupply + accruedToTreasury).rayMulFloor(_getReserveNormalizedIncome(asset));
}

function _isBorrowingAny(address user) internal view returns (bool) {
Expand Down
4 changes: 2 additions & 2 deletions tests/protocol/pool/Pool.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ contract PoolTests is TestnetProcedures {
assets[0] = tokenList.usdx;

uint256 accruedToTreasury = uint256(pool.getReserveData(tokenList.usdx).accruedToTreasury)
.rayMul(pool.getReserveNormalizedIncome(tokenList.usdx), WadRayMath.Rounding.Floor);
.rayMulFloor(pool.getReserveNormalizedIncome(tokenList.usdx));

vm.expectEmit(address(contracts.poolProxy));
emit IPool.MintedToTreasury(tokenList.usdx, accruedToTreasury);
Expand Down Expand Up @@ -487,7 +487,7 @@ contract PoolTests is TestnetProcedures {
assets[1] = tokenList.usdx;

uint256 accruedToTreasury = uint256(pool.getReserveData(tokenList.usdx).accruedToTreasury)
.rayMul(pool.getReserveNormalizedIncome(tokenList.usdx), WadRayMath.Rounding.Floor);
.rayMulFloor(pool.getReserveNormalizedIncome(tokenList.usdx));

vm.expectEmit(address(contracts.poolProxy));
emit IPool.MintedToTreasury(tokenList.usdx, accruedToTreasury);
Expand Down
22 changes: 8 additions & 14 deletions tests/protocol/tokenization/ATokenEvents.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,10 @@ contract ATokenEventsTests is TestnetProcedures {
uint256 balanceIncrease;
{
uint256 scaledBalance = IAToken(aTokenAddress).scaledBalanceOf(onBehalfOf);
uint256 scaledMintAmount = amount.rayDiv(newIndex, WadRayMath.Rounding.Floor);
uint256 nextBalance = (scaledBalance + scaledMintAmount).rayMul(
newIndex,
WadRayMath.Rounding.Floor
);
uint256 previousBalance = scaledBalance.rayMul(oldIndex, WadRayMath.Rounding.Floor);
balanceIncrease = scaledBalance.rayMul(newIndex, WadRayMath.Rounding.Floor) - previousBalance;
uint256 scaledMintAmount = amount.rayDivFloor(newIndex);
uint256 nextBalance = (scaledBalance + scaledMintAmount).rayMulFloor(newIndex);
uint256 previousBalance = scaledBalance.rayMulFloor(oldIndex);
balanceIncrease = scaledBalance.rayMulFloor(newIndex) - previousBalance;
mintAmount = nextBalance - previousBalance;
}

Expand Down Expand Up @@ -106,13 +103,10 @@ contract ATokenEventsTests is TestnetProcedures {
uint256 balanceIncrease;
{
uint256 scaledBalance = IAToken(aTokenAddress).scaledBalanceOf(user);
uint256 scaledBurnAmount = amount.rayDiv(newIndex, WadRayMath.Rounding.Ceil);
uint256 nextBalance = (scaledBalance - scaledBurnAmount).rayMul(
newIndex,
WadRayMath.Rounding.Floor
);
uint256 previousBalance = scaledBalance.rayMul(oldIndex, WadRayMath.Rounding.Floor);
balanceIncrease = scaledBalance.rayMul(newIndex, WadRayMath.Rounding.Floor) - previousBalance;
uint256 scaledBurnAmount = amount.rayDivCeil(newIndex);
uint256 nextBalance = (scaledBalance - scaledBurnAmount).rayMulFloor(newIndex);
uint256 previousBalance = scaledBalance.rayMulFloor(oldIndex);
balanceIncrease = scaledBalance.rayMulFloor(newIndex) - previousBalance;
deltaAmount = int256(nextBalance) - int256(previousBalance);
}

Expand Down
17 changes: 5 additions & 12 deletions tests/protocol/tokenization/ATokenTransfers.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,7 @@ contract ATokenTransferTests is TestnetProcedures {

uint256 previousIndex = 1e27;
uint256 expectedIndex = 1.0001e27;
uint256 expectedScaledTransferAmount = transferAmount.rayDiv(
expectedIndex,
WadRayMath.Rounding.Ceil
);
uint256 expectedScaledTransferAmount = transferAmount.rayDivCeil(expectedIndex);

mockAToken.setStorage(
alice,
Expand All @@ -340,14 +337,10 @@ contract ATokenTransferTests is TestnetProcedures {
bobScaledBalanceBefore
);

uint256 senderBalanceIncrease = aliceScaledBalanceBefore.rayMul(
expectedIndex,
WadRayMath.Rounding.Floor
) - aliceScaledBalanceBefore.rayMul(previousIndex, WadRayMath.Rounding.Floor);
uint256 recipientBalanceIncrease = bobScaledBalanceBefore.rayMul(
expectedIndex,
WadRayMath.Rounding.Floor
) - bobScaledBalanceBefore.rayMul(previousIndex, WadRayMath.Rounding.Floor);
uint256 senderBalanceIncrease = aliceScaledBalanceBefore.rayMulFloor(expectedIndex) -
aliceScaledBalanceBefore.rayMulFloor(previousIndex);
uint256 recipientBalanceIncrease = bobScaledBalanceBefore.rayMulFloor(expectedIndex) -
bobScaledBalanceBefore.rayMulFloor(previousIndex);

vm.expectEmit(address(mockAToken));
emit IERC20.Transfer(address(0), alice, senderBalanceIncrease);
Expand Down
38 changes: 14 additions & 24 deletions tests/protocol/tokenization/VariableDebtToken.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -176,29 +176,25 @@ contract VariableDebtTokenEventsTests is TestnetProcedures {
uint256 amount = 1200 * 10 ** decimals;
uint256 repayment = amount / 2;
uint256 supplyIndex = 1.001e27;
uint256 balanceScaled = amount.rayDiv(supplyIndex, WadRayMath.Rounding.Ceil);
uint256 balanceScaled = amount.rayDivCeil(supplyIndex);
uint256 newIndex = 1.003e27;
uint256 repaymentScaled = repayment.rayDiv(newIndex, WadRayMath.Rounding.Floor);
uint256 repaymentScaled = repayment.rayDivFloor(newIndex);

vm.expectEmit(address(debtToken));
emit IScaledBalanceToken.Mint(
alice,
alice,
balanceScaled.rayMul(supplyIndex, WadRayMath.Rounding.Ceil),
balanceScaled.rayMulCeil(supplyIndex),
0,
supplyIndex
);

vm.prank(report.poolProxy);
debtToken.mint(alice, alice, amount, amount.rayDivCeil(supplyIndex), supplyIndex);

uint256 nextBalance = (balanceScaled - repaymentScaled).rayMul(
newIndex,
WadRayMath.Rounding.Ceil
);
uint256 previousBalance = balanceScaled.rayMul(supplyIndex, WadRayMath.Rounding.Ceil);
uint256 balanceIncrease = balanceScaled.rayMul(newIndex, WadRayMath.Rounding.Ceil) -
previousBalance;
uint256 nextBalance = (balanceScaled - repaymentScaled).rayMulCeil(newIndex);
uint256 previousBalance = balanceScaled.rayMulCeil(supplyIndex);
uint256 balanceIncrease = balanceScaled.rayMulCeil(newIndex) - previousBalance;

vm.expectEmit(address(debtToken));
emit IScaledBalanceToken.Burn(
Expand All @@ -221,29 +217,25 @@ contract VariableDebtTokenEventsTests is TestnetProcedures {
uint256 amount = 1200 * 10 ** decimals;
uint256 supplyIndex = 1.001e27;
uint256 newIndex = 1.003e27;
uint256 balanceScaled = amount.rayDiv(supplyIndex, WadRayMath.Rounding.Ceil);
uint256 balanceScaled = amount.rayDivCeil(supplyIndex);
uint256 repayment = amount;
uint256 repaymentScaled = repayment.rayDiv(newIndex, WadRayMath.Rounding.Floor);
uint256 repaymentScaled = repayment.rayDivFloor(newIndex);

vm.expectEmit(address(debtToken));
emit IScaledBalanceToken.Mint(
alice,
alice,
balanceScaled.rayMul(supplyIndex, WadRayMath.Rounding.Ceil),
balanceScaled.rayMulCeil(supplyIndex),
0,
supplyIndex
);

vm.prank(report.poolProxy);
debtToken.mint(alice, alice, amount, amount.rayDivCeil(supplyIndex), supplyIndex);

uint256 nextBalance = (balanceScaled - repaymentScaled).rayMul(
newIndex,
WadRayMath.Rounding.Ceil
);
uint256 previousBalance = balanceScaled.rayMul(supplyIndex, WadRayMath.Rounding.Ceil);
uint256 balanceIncrease = balanceScaled.rayMul(newIndex, WadRayMath.Rounding.Ceil) -
previousBalance;
uint256 nextBalance = (balanceScaled - repaymentScaled).rayMulCeil(newIndex);
uint256 previousBalance = balanceScaled.rayMulCeil(supplyIndex);
uint256 balanceIncrease = balanceScaled.rayMulCeil(newIndex) - previousBalance;

vm.expectEmit(address(debtToken));
emit IScaledBalanceToken.Burn(
Expand Down Expand Up @@ -290,8 +282,7 @@ contract VariableDebtTokenEventsTests is TestnetProcedures {
uint256 previousIndex = contracts.poolProxy.getReserveNormalizedVariableDebt(tokenList.usdx);
vm.warp(vm.getBlockTimestamp() + 30 days);
uint256 newIndex = contracts.poolProxy.getReserveNormalizedVariableDebt(tokenList.usdx);
uint256 balanceIncrease = amount.rayMul(newIndex, WadRayMath.Rounding.Ceil) -
amount.rayMul(previousIndex, WadRayMath.Rounding.Ceil);
uint256 balanceIncrease = amount.rayMulCeil(newIndex) - amount.rayMulCeil(previousIndex);

assertEq(variableDebtToken.balanceOf(alice), amount + balanceIncrease);
}
Expand Down Expand Up @@ -350,8 +341,7 @@ contract VariableDebtTokenEventsTests is TestnetProcedures {

assertEq(
variableDebtToken.scaledBalanceOf(alice),
aliceAmount1.rayDiv(index1, WadRayMath.Rounding.Ceil) +
aliceAmount2.rayDiv(index2, WadRayMath.Rounding.Ceil)
aliceAmount1.rayDivCeil(index1) + aliceAmount2.rayDivCeil(index2)
);
}

Expand Down
Loading