-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: amount withdrawn after multiple withdrawals (#255)
* test: amount withdrawn after multiple withdrawals * test: rename mvt to scaleFactor * test: rename test to "withdraw no delay" test: polish delay test --------- Co-authored-by: andreivladbrg <andreivladbrg@gmail.com>
- Loading branch information
1 parent
95dc7eb
commit 2b3eca7
Showing
1 changed file
with
45 additions
and
0 deletions.
There are no files selected for viewing
45 changes: 45 additions & 0 deletions
45
test/integration/concrete/withdraw-no-delay/withdrawNoDelay.t.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// SPDX-License-Identifier: UNLICENSED | ||
pragma solidity >=0.8.22; | ||
|
||
import { ud21x18 } from "@prb/math/src/UD21x18.sol"; | ||
|
||
import { Integration_Test } from "../../Integration.t.sol"; | ||
|
||
contract WithdrawNoDelay_Integration_Concrete_Test is Integration_Test { | ||
function test_AmountWithdrawn_MultipleWithdrawals() external { | ||
uint128 scaleFactor = getScaledAmount(1, DECIMALS); | ||
|
||
// Choose an rps such that rps < scaleFactor. | ||
uint128 rps = 0.000000011574e18; | ||
assertLt(rps, scaleFactor, "rps must be less than scaleFactor"); | ||
|
||
// Create the stream. | ||
uint256 streamId = flow.createAndDeposit(users.sender, users.recipient, ud21x18(rps), usdc, TRANSFERABLE, 1000); | ||
|
||
// Interval at which withdraw will be called. | ||
uint40 withdrawInterval = 3600; // ~ 1 hour | ||
|
||
// Number of times withdraw will be called. | ||
uint128 withdrawCount = 20; | ||
|
||
uint128 actualTotalAmountWithdrawn; | ||
|
||
// Call withdraw multiple times. | ||
for (uint256 i; i < withdrawCount; ++i) { | ||
// Warp to the withdrawInterval. | ||
vm.warp(getBlockTimestamp() + withdrawInterval); | ||
|
||
// Withdraw the maximum amount. | ||
uint128 withdrawnAmount = flow.withdrawMax(streamId, users.recipient); | ||
|
||
// Update the total amount withdrawn to the recipient | ||
actualTotalAmountWithdrawn += withdrawnAmount; | ||
} | ||
|
||
// Expect this amount to be withdrawn if there were no precision loss. This is also the real streamed value. | ||
uint128 expectedTotalAmountWithdrawn = getDescaledAmount(rps * withdrawInterval * withdrawCount, DECIMALS); | ||
|
||
// Assert that the actual amount withdrawn is equal to the expected amount. | ||
assertEq(actualTotalAmountWithdrawn, expectedTotalAmountWithdrawn, "Streaming loss"); | ||
} | ||
} |