Skip to content

Commit a7f0b8f

Browse files
committed
fix: missing approval in ParaSwap repay adapter
1 parent f70d143 commit a7f0b8f

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

contracts/adapters/ParaSwapRepayAdapter.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ contract ParaSwapRepayAdapter is BaseParaSwapBuyAdapter, ReentrancyGuard {
136136

137137
//deposit collateral back in the pool, if left after the swap(buy)
138138
if (collateralBalanceLeft > 0) {
139+
IERC20(collateralAsset).safeApprove(address(LENDING_POOL), 0);
140+
IERC20(collateralAsset).safeApprove(address(LENDING_POOL), collateralBalanceLeft);
139141
LENDING_POOL.deposit(address(collateralAsset), collateralBalanceLeft, msg.sender, 0);
140142
}
141143

test-suites/test-aave/paraswapAdapters.repay.spec.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,90 @@ makeSuite('Paraswap adapters', (testEnv: TestEnv) => {
11741174
expect(userWethBalance).to.be.eq(userWethBalanceBefore);
11751175
});
11761176

1177+
it('should swap (not whole amount), repay debt and pull the needed ATokens leaving no leftovers', async () => {
1178+
const {
1179+
users,
1180+
pool,
1181+
weth,
1182+
aWETH,
1183+
oracle,
1184+
dai,
1185+
paraswapRepayAdapter,
1186+
helpersContract,
1187+
} = testEnv;
1188+
const user = users[0].signer;
1189+
const userAddress = users[0].address;
1190+
1191+
const amountWETHtoSwap = await convertToCurrencyDecimals(weth.address, '10');
1192+
1193+
const daiPrice = await oracle.getAssetPrice(dai.address);
1194+
const expectedDaiAmount = await convertToCurrencyDecimals(
1195+
dai.address,
1196+
new BigNumber(amountWETHtoSwap.toString()).div(daiPrice.toString()).toFixed(0)
1197+
);
1198+
1199+
// Open user Debt
1200+
await pool.connect(user).borrow(dai.address, expectedDaiAmount, 1, 0, userAddress);
1201+
1202+
const daiStableDebtTokenAddress = (
1203+
await helpersContract.getReserveTokensAddresses(dai.address)
1204+
).stableDebtTokenAddress;
1205+
1206+
const daiStableDebtContract = await getContract<StableDebtToken>(
1207+
eContractid.StableDebtToken,
1208+
daiStableDebtTokenAddress
1209+
);
1210+
1211+
const userDaiStableDebtAmountBefore = await daiStableDebtContract.balanceOf(userAddress);
1212+
1213+
const liquidityToSwap = amountWETHtoSwap;
1214+
const swappedAmount = await convertToCurrencyDecimals(weth.address, '9.9');
1215+
1216+
await mockAugustus.expectBuy(weth.address, dai.address, swappedAmount, expectedDaiAmount, expectedDaiAmount);
1217+
const mockAugustusCalldata = mockAugustus.interface.encodeFunctionData(
1218+
'buy',
1219+
[weth.address, dai.address, liquidityToSwap, expectedDaiAmount]
1220+
);
1221+
1222+
const params = buildParaswapBuyParams(mockAugustusCalldata, mockAugustus.address)
1223+
await aWETH.connect(user).approve(paraswapRepayAdapter.address, liquidityToSwap);
1224+
const userAEthBalanceBefore = await aWETH.balanceOf(userAddress);
1225+
const userWethBalanceBefore = await weth.balanceOf(userAddress);
1226+
1227+
await paraswapRepayAdapter.connect(user).swapAndRepay(
1228+
weth.address,
1229+
dai.address,
1230+
liquidityToSwap,
1231+
expectedDaiAmount,
1232+
1,
1233+
0,
1234+
params,
1235+
{
1236+
amount: 0,
1237+
deadline: 0,
1238+
v: 0,
1239+
r: '0x0000000000000000000000000000000000000000000000000000000000000000',
1240+
s: '0x0000000000000000000000000000000000000000000000000000000000000000',
1241+
}
1242+
);
1243+
1244+
const adapterWethBalance = await weth.balanceOf(paraswapRepayAdapter.address);
1245+
const adapterDaiBalance = await dai.balanceOf(paraswapRepayAdapter.address);
1246+
const userDaiStableDebtAmount = await daiStableDebtContract.balanceOf(userAddress);
1247+
const userAEthBalance = await aWETH.balanceOf(userAddress);
1248+
const adapterAEthBalance = await aWETH.balanceOf(paraswapRepayAdapter.address);
1249+
const userWethBalance = await weth.balanceOf(userAddress);
1250+
1251+
expect(adapterAEthBalance).to.be.eq(Zero);
1252+
expect(adapterWethBalance).to.be.eq(Zero);
1253+
expect(adapterDaiBalance).to.be.eq(Zero);
1254+
expect(userDaiStableDebtAmountBefore).to.be.gte(expectedDaiAmount);
1255+
expect(userDaiStableDebtAmount).to.be.lt(expectedDaiAmount);
1256+
expect(userAEthBalance).to.be.lt(userAEthBalanceBefore);
1257+
expect(userAEthBalance).to.be.eq(userAEthBalanceBefore.sub(swappedAmount));
1258+
expect(userWethBalance).to.be.eq(userWethBalanceBefore);
1259+
});
1260+
11771261
it('should correctly swap tokens and repay the whole stable debt', async () => {
11781262
const {
11791263
users,

0 commit comments

Comments
 (0)