it("should use consistent scaling between transfer and transferFrom", async function () {
const mintAmount = ethers.parseEther("100");
await mockLendingPool.mockMint(reservePool.address, user1.address, mintAmount, RAY);
const transferAmount = ethers.parseEther("25");
const user2BalanceBeforeTransfer = await rToken.balanceOf(user2.address);
await rToken.connect(user1).transfer(user2.address, transferAmount);
const balanceAfterTransfer1 = await rToken.balanceOf(user2.address);
const netTransfer = balanceAfterTransfer1 - user2BalanceBeforeTransfer;
await rToken.connect(user1).approve(user3.address, transferAmount);
const user2BalanceBeforeTranferFrom = await rToken.balanceOf(user2.address);
await rToken.connect(user3).transferFrom(user1.address, user2.address, transferAmount);
const balanceAfterTransferFrom1 = await rToken.balanceOf(user2.address);
const netTransferFrom1 = balanceAfterTransferFrom1 - user2BalanceBeforeTranferFrom;
console.log("Balance after transfer:", balanceAfterTransfer1.toString());
console.log("Balance after transferFrom:", balanceAfterTransferFrom1.toString());
expect(netTransferFrom1).to.equal(netTransfer);
const newIndex = RAY + (RAY / 10n);
await mockLendingPool.mockGetNormalizedIncome(newIndex);
const user2BalanceBeforeTransfer2 = await rToken.balanceOf(user2.address);
await rToken.connect(user1).transfer(user2.address, transferAmount);
const balanceAfterTransfer2 = await rToken.balanceOf(user2.address);
const netTransfer2 = balanceAfterTransfer2 - user2BalanceBeforeTransfer2;
await rToken.connect(user1).approve(user3.address, transferAmount);
const user2BalanceBeforeTranferFrom2 = await rToken.balanceOf(user2.address);
await rToken.connect(user3).transferFrom(user1.address, user2.address, transferAmount);
const balanceAfterTransferFrom2 = await rToken.balanceOf(user2.address);
const netTransferFrom2 = balanceAfterTransferFrom2 - user2BalanceBeforeTranferFrom2;
console.log("Balance after transfer:", balanceAfterTransfer2.toString());
console.log("Balance after transferFrom:", balanceAfterTransferFrom2.toString());
expect(netTransfer2).to.equal(netTransferFrom2);
});
function transferFrom(address sender, address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
+ uint256 scaledAmount = amount.rayDiv(ILendingPool(_reservePool).getNormalizedIncome());
- uint256 scaledAmount = amount.rayDiv(_liquidityIndex); //@audit note scaled amount is different than the transfer function
return super.transferFrom(sender, recipient, scaledAmount);
}