function transfer(address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
uint256 scaledAmount = amount.rayDiv(ILendingPool(_reservePool).getNormalizedIncome());
return super.transfer(recipient, scaledAmount);
}
function transferFrom(address sender, address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
uint256 scaledAmount = amount.rayDiv(_liquidityIndex);
return super.transferFrom(sender, recipient, scaledAmount);
}
import {Test} from "forge-std/Test.sol";
import {RToken} from "../contracts/core/tokens/RToken.sol";
import "../contracts/libraries/math/WadRayMath.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {console} from "forge-std/console.sol";
contract MockLendingPool {
function getNormalizedIncome() external pure returns (uint256) {
return 1.1e27;
}
}
contract MockERC20 is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
_mint(msg.sender, 1000000e18);
}
}
contract RTokenPoc is Test {
using WadRayMath for uint256;
RToken rToken;
address owner;
address user1;
address user2;
ERC20 assestaddress;
MockLendingPool lendingPool;
function setUp() public {
lendingPool = new MockLendingPool();
assestaddress = new MockERC20("testassest", "TAA");
owner = address(this);
user1 = makeAddr("user1");
user2 = makeAddr("user2");
rToken = new RToken("RToken", "RT", owner, address(assestaddress));
rToken.setReservePool(address(lendingPool));
vm.prank(address(lendingPool));
rToken.mint(address(lendingPool), user1, 1000e18, WadRayMath.RAY);
}
function test_transfer_multiple_scaling() public {
uint256 amount = 1000e18;
console.log("Initial balance (normalized) of user1: %s", rToken.balanceOf(user1));
console.log("Initial scaled balance of user1: %s", rToken.scaledBalanceOf(user1));
vm.prank(user1);
rToken.transfer(user2, amount);
console.log("Final balance (normalized) of user2: %s", rToken.balanceOf(user2));
console.log("Final scaled balance of user2: %s", rToken.scaledBalanceOf(user2));
assert(rToken.balanceOf(user2) == amount);
}
function test_transferFrom_multiple_scaling() public {
uint256 amount = 1000e18;
console.log("Initial balance (normalized) of user1: %s", rToken.balanceOf(user1));
console.log("Initial scaled balance of user1: %s", rToken.scaledBalanceOf(user1));
vm.prank(address(lendingPool));
rToken.updateLiquidityIndex(1.1e27);
vm.prank(user1);
rToken.approve(user2, amount);
vm.prank(user2);
rToken.transferFrom(user1, user2, amount);
console.log("Final balance (normalized) of user2: %s", rToken.balanceOf(user2));
console.log("Final scaled balance of user2: %s", rToken.scaledBalanceOf(user2));
assert(rToken.balanceOf(user2) == amount);
}
}
function transfer(address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
- uint256 scaledAmount = amount.rayDiv(ILendingPool(_reservePool).getNormalizedIncome());
- return super.transfer(recipient, scaledAmount);
+ return super.transfer(recipient, amount);
}
function transferFrom(address sender, address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool) {
- uint256 scaledAmount = amount.rayDiv(_liquidityIndex);
- return super.transferFrom(sender, recipient, scaledAmount);
+ return super.transferFrom(sender, recipient, amount);
}