@@ -198,11 +198,8 @@ contract RebaseTokenTest is Test {
198198 );
199199 }
200200
201- function testTransferFromWithAllowance (
202- uint256 allowance /*uint256 amount */
203- ) public {
201+ function testTransferFromWithAllowance (uint256 allowance ) public {
204202 allowance = bound (allowance, 1e5 , type (uint96 ).max);
205- //amount = bound(amount, 1e5, type(uint96).max);
206203
207204 vm.deal (owner, allowance);
208205 vm.prank (owner);
@@ -229,4 +226,112 @@ contract RebaseTokenTest is Test {
229226 assertEq (user1BalanceAfter, user1Balance + allowance);
230227 assertEq (userAllowanceAfter, userAllowanceBefore - allowance);
231228 }
229+
230+ function testTransferFromWithMaxUintAllowance (
231+ uint256 depositAmount ,
232+ uint256 amountSent
233+ ) public {
234+ depositAmount = bound (depositAmount, 1e5 + 1e5 , type (uint96 ).max);
235+ amountSent = bound (amountSent, 1e5 , depositAmount - 1e5 );
236+
237+ // fund owner with Eth and Deposit into vault
238+ vm.deal (owner, depositAmount);
239+ vm.prank (owner);
240+ vault.deposit {value: depositAmount}();
241+
242+ // Approve spender with Max uint256 allowance
243+ vm.prank (owner);
244+ rebaseToken.approve (user, type (uint256 ).max);
245+
246+ address user1 = makeAddr ("user1 " );
247+ uint256 ownerBalance = rebaseToken.balanceOf (owner);
248+ uint256 user1Balance = rebaseToken.balanceOf (user1);
249+ uint256 userAllowanceBefore = rebaseToken.allowance (owner, user);
250+ console.log ("Owner's Balance " , ownerBalance);
251+ console.log ("User1 Balance " , user1Balance);
252+ console.log ("User's Allowance Before " , userAllowanceBefore);
253+
254+ vm.prank (user);
255+ rebaseToken.transferFrom (owner, user1, amountSent);
256+
257+ uint256 ownerBalanceAfter = rebaseToken.balanceOf (owner);
258+ uint256 user1BalanceAfter = rebaseToken.balanceOf (user1);
259+ uint256 userAllowanceAfter = rebaseToken.allowance (owner, user);
260+
261+ // Assert the balances and allowance are updated correctly
262+ assertEq (ownerBalanceAfter, ownerBalance - amountSent);
263+ assertEq (user1BalanceAfter, user1Balance + amountSent);
264+
265+ //If allowance was uint256.max, it should not reduce
266+ assertEq (userAllowanceAfter, type (uint256 ).max);
267+ }
268+
269+ function testTransferWithMaxAmount (uint256 depositAmount ) public {
270+ depositAmount = bound (depositAmount, 1e5 , type (uint96 ).max);
271+
272+ vm.deal (user, depositAmount);
273+ vm.prank (user);
274+ vault.deposit {value: depositAmount}();
275+
276+ address user1 = makeAddr ("user1 " );
277+ vm.prank (user);
278+ rebaseToken.transfer (user1, type (uint256 ).max);
279+
280+ uint256 userBalance = rebaseToken.balanceOf (user);
281+ uint256 user1Balance = rebaseToken.balanceOf (user1);
282+
283+ assertEq (userBalance, 0 );
284+ assertEq (user1Balance, depositAmount);
285+ }
286+
287+ function testTransferFromWithMaxUintAmount (uint256 amount ) public {
288+ amount = bound (amount, 1e5 , type (uint96 ).max);
289+
290+ vm.deal (owner, amount);
291+ vm.prank (owner);
292+ vault.deposit {value: amount}();
293+
294+ vm.prank (owner);
295+ rebaseToken.approve (user, type (uint256 ).max);
296+ address user1 = makeAddr ("user1 " );
297+
298+ uint256 ownerBalance = rebaseToken.balanceOf (owner);
299+ uint256 user1Balance = rebaseToken.balanceOf (user1);
300+
301+ vm.prank (user);
302+ rebaseToken.transferFrom (owner, user1, type (uint256 ).max);
303+
304+ uint256 ownerBalanceAfter = rebaseToken.balanceOf (owner);
305+ uint256 user1BalanceAfter = rebaseToken.balanceOf (user1);
306+
307+ // Assert the balances and allowance are updated correctly
308+ assertEq (ownerBalanceAfter, ownerBalance - amount);
309+ assertEq (user1BalanceAfter, user1Balance + amount);
310+ }
311+
312+ function testRedeemFailsIfEthTransferFails (uint256 amount ) public {
313+ amount = bound (amount, 1e5 , type (uint96 ).max);
314+ RevertingReceiver badReceiver = new RevertingReceiver ();
315+
316+ // Give it some RebaseTokens
317+ vm.deal (address (badReceiver), 0 );
318+ vm.deal (address (this ), amount);
319+
320+ // Deposit from this contract and transfer to badReceiver
321+ vault.deposit {value: amount}();
322+ rebaseToken.transfer (address (badReceiver), amount);
323+
324+ // Try redeeming from badReceiver
325+ vm.expectRevert (Vault.Vault__RedeemFailed.selector );
326+ vm.prank (address (badReceiver));
327+ vault.redeem (type (uint256 ).max);
328+ }
329+ }
330+
331+ contract RevertingReceiver {
332+ // fallback that rejects ETH
333+
334+ receive () external payable {
335+ revert ("Can't accept ETH " );
336+ }
232337}
0 commit comments