Skip to content
This repository was archived by the owner on Mar 26, 2025. It is now read-only.

Commit 5d55a7e

Browse files
committed
test: improve airstream design tests
1 parent d6d66a1 commit 5d55a7e

File tree

7 files changed

+80
-46
lines changed

7 files changed

+80
-46
lines changed

test/Base.t.sol

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
2020
IPRBProxy internal aliceProxy;
2121
IERC20 internal asset;
2222
ISablierV2AirstreamCampaign internal campaign;
23+
ISablierV2AirstreamCampaignLD internal campaignLD;
24+
ISablierV2AirstreamCampaignLL internal campaignLL;
2325
ISablierV2AirstreamCampaignFactory internal campaignFactory;
2426
Defaults internal defaults;
2527
ISablierV2Lockup lockup;
@@ -129,6 +131,9 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
129131
vm.label({ account: address(aliceProxy), newLabel: "Alice's Proxy" });
130132
vm.label({ account: address(archive), newLabel: "Archive" });
131133
vm.label({ account: address(asset), newLabel: IERC20Metadata(address(asset)).symbol() });
134+
vm.label({ account: address(campaignFactory), newLabel: "CampaignFactory" });
135+
vm.label({ account: address(campaignLD), newLabel: "Campaign LD" });
136+
vm.label({ account: address(campaignLL), newLabel: "Campaign LL" });
132137
vm.label({ account: address(defaults), newLabel: "Defaults" });
133138
vm.label({ account: address(lockupDynamic), newLabel: "LockupDynamic" });
134139
vm.label({ account: address(lockupLinear), newLabel: "LockupLinear" });
@@ -325,9 +330,13 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
325330
});
326331
}
327332

328-
function createAirstreamCampaignLD() internal returns (ISablierV2AirstreamCampaignLD) {
333+
function createAirstreamCampaignLD() internal {
334+
campaignLD = createAirstreamCampaignLD(users.admin.addr);
335+
}
336+
337+
function createAirstreamCampaignLD(address admin) internal returns (ISablierV2AirstreamCampaignLD) {
329338
return campaignFactory.createAirstreamCampaignLD({
330-
initialAdmin: users.admin.addr,
339+
initialAdmin: admin,
331340
asset: asset,
332341
merkleRoot: defaults.merkleRoot(),
333342
cancelable: defaults.CANCELABLE(),
@@ -341,19 +350,22 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
341350
}
342351

343352
function computeCampaignLDAddress() internal returns (address) {
344-
bytes32 salt =
345-
keccak256(abi.encodePacked(users.admin.addr, asset, defaults.merkleRoot(), defaults.EXPIRATION()));
346-
bytes32 creationBytecodeHash = keccak256(getCampaignLDBytecode());
353+
return computeCampaignLDAddress(users.admin.addr);
354+
}
355+
356+
function computeCampaignLDAddress(address admin) internal returns (address) {
357+
bytes32 salt = keccak256(abi.encodePacked(admin, asset, defaults.merkleRoot(), defaults.EXPIRATION()));
358+
bytes32 creationBytecodeHash = keccak256(getCampaignLDBytecode(admin));
347359
return computeCreate2Address({
348360
salt: salt,
349361
initcodeHash: creationBytecodeHash,
350362
deployer: address(campaignFactory)
351363
});
352364
}
353365

354-
function getCampaignLDBytecode() internal returns (bytes memory) {
366+
function getCampaignLDBytecode(address admin) internal returns (bytes memory) {
355367
bytes memory constructorArgs = abi.encode(
356-
users.admin.addr,
368+
admin,
357369
asset,
358370
defaults.merkleRoot(),
359371
defaults.CANCELABLE(),
@@ -371,9 +383,13 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
371383
}
372384
}
373385

374-
function createAirstreamCampaignLL() internal returns (ISablierV2AirstreamCampaignLL) {
386+
function createAirstreamCampaignLL() internal {
387+
campaignLL = createAirstreamCampaignLL(users.admin.addr);
388+
}
389+
390+
function createAirstreamCampaignLL(address admin) internal returns (ISablierV2AirstreamCampaignLL) {
375391
return campaignFactory.createAirstreamCampaignLL({
376-
initialAdmin: users.admin.addr,
392+
initialAdmin: admin,
377393
asset: asset,
378394
merkleRoot: defaults.merkleRoot(),
379395
cancelable: defaults.CANCELABLE(),
@@ -387,19 +403,22 @@ abstract contract Base_Test is Assertions, Events, StdCheats, V2CoreUtils {
387403
}
388404

389405
function computeCampaignLLAddress() internal returns (address) {
390-
bytes32 salt =
391-
keccak256(abi.encodePacked(users.admin.addr, asset, defaults.merkleRoot(), defaults.EXPIRATION()));
392-
bytes32 creationBytecodeHash = keccak256(getCampaignLLBytecode());
406+
return computeCampaignLLAddress(users.admin.addr);
407+
}
408+
409+
function computeCampaignLLAddress(address admin) internal returns (address) {
410+
bytes32 salt = keccak256(abi.encodePacked(admin, asset, defaults.merkleRoot(), defaults.EXPIRATION()));
411+
bytes32 creationBytecodeHash = keccak256(getCampaignLLBytecode(admin));
393412
return computeCreate2Address({
394413
salt: salt,
395414
initcodeHash: creationBytecodeHash,
396415
deployer: address(campaignFactory)
397416
});
398417
}
399418

400-
function getCampaignLLBytecode() internal returns (bytes memory) {
419+
function getCampaignLLBytecode(address admin) internal returns (bytes memory) {
401420
bytes memory constructorArgs = abi.encode(
402-
users.admin.addr,
421+
admin,
403422
asset,
404423
defaults.merkleRoot(),
405424
defaults.CANCELABLE(),

test/integration/Integration.t.sol

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ abstract contract Integration_Test is Base_Test {
3131
// Deploy V2 Periphery.
3232
deployPeripheryConditionally();
3333

34+
// Create the airstream campaign.
35+
createAirstreamCampaignLD();
36+
createAirstreamCampaignLL();
37+
38+
// Fund the campaigns.
39+
deal({ token: address(asset), to: address(campaignLD), give: defaults.CAMPAIGN_TOTAL_AMOUNT() });
40+
deal({ token: address(asset), to: address(campaignLL), give: defaults.CAMPAIGN_TOTAL_AMOUNT() });
41+
3442
// Label the contracts.
3543
labelContracts();
3644

test/integration/airstream/campaign-factory/create-airstream-campaign-ld/createAirstreamCampaignLD.t.sol

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import { ISablierV2AirstreamCampaignLD } from "src/interfaces/ISablierV2Airstrea
99
import { Integration_Test } from "../../../Integration.t.sol";
1010

1111
contract CreateAirstreamCampaignLD_Integration_Test is Integration_Test {
12-
function test_CreateAirstreamCampaignLD_AlreadyExists() external {
13-
createAirstreamCampaignLD();
12+
function setUp() public override {
13+
Integration_Test.setUp();
14+
}
1415

16+
function test_CreateAirstreamCampaignLD_AlreadyExists() external {
1517
bytes32 merkleRoot = defaults.merkleRoot();
1618
bool cancelable = defaults.CANCELABLE();
1719
uint40 expiration = defaults.EXPIRATION();
@@ -35,24 +37,25 @@ contract CreateAirstreamCampaignLD_Integration_Test is Integration_Test {
3537
);
3638
}
3739

38-
function test_CreateAirstreamCampaignLD() external {
39-
address computedCampaign = computeCampaignLDAddress();
40+
function test_CreateAirstreamCampaignLD(address admin) external {
41+
vm.assume(admin != users.admin.addr);
42+
address computedCampaignLD = computeCampaignLDAddress(admin);
4043

4144
vm.expectEmit({ emitter: address(campaignFactory) });
4245
emit CreateAirstreamCampaignLD(
43-
users.admin.addr,
46+
admin,
4447
asset,
45-
ISablierV2AirstreamCampaignLD(computedCampaign),
48+
ISablierV2AirstreamCampaignLD(computedCampaignLD),
4649
defaults.IPFS_CID(),
4750
defaults.CAMPAIGN_TOTAL_AMOUNT(),
4851
defaults.RECIPIENTS_COUNT()
4952
);
50-
address actualCampaignLD = address(createAirstreamCampaignLD());
53+
address actualCampaignLD = address(createAirstreamCampaignLD(admin));
5154

52-
ISablierV2AirstreamCampaign[] memory expectedCampaign = campaignFactory.getAirstreamCampaigns(users.admin.addr);
55+
ISablierV2AirstreamCampaign[] memory expectedCampaign = campaignFactory.getAirstreamCampaigns(admin);
5356

5457
assertTrue(actualCampaignLD.code.length > 0, "campaignLD was not created");
55-
assertEq(actualCampaignLD, computedCampaign, "campaignLD address does not match computed address");
58+
assertEq(actualCampaignLD, computedCampaignLD, "campaignLD address does not match computed address");
5659
assertEq(actualCampaignLD, address(expectedCampaign[0]), "campaignLD was not stored in the campaigns mapping");
5760
}
5861
}

test/integration/airstream/campaign-factory/create-airstream-campaign-ll/createAirstreamCampaignLL.t.sol

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import { ISablierV2AirstreamCampaignLL } from "src/interfaces/ISablierV2Airstrea
99
import { Integration_Test } from "../../../Integration.t.sol";
1010

1111
contract CreateAirstreamCampaignLL_Integration_Test is Integration_Test {
12-
function test_CreateAirstreamCampaignLL_AlreadyExists() external {
13-
createAirstreamCampaignLL();
12+
function setUp() public override {
13+
Integration_Test.setUp();
14+
}
1415

16+
function test_CreateAirstreamCampaignLL_AlreadyExists() external {
1517
bytes32 merkleRoot = defaults.merkleRoot();
1618
bool cancelable = defaults.CANCELABLE();
1719
uint40 expiration = defaults.EXPIRATION();
@@ -35,24 +37,25 @@ contract CreateAirstreamCampaignLL_Integration_Test is Integration_Test {
3537
);
3638
}
3739

38-
function test_CreateAirstreamCampaignLL() external {
39-
address computedCampaign = computeCampaignLLAddress();
40+
function test_CreateAirstreamCampaignLL(address admin) external {
41+
vm.assume(admin != users.admin.addr);
42+
address computedCampaignLL = computeCampaignLLAddress(admin);
4043

4144
vm.expectEmit({ emitter: address(campaignFactory) });
4245
emit CreateAirstreamCampaignLL(
43-
users.admin.addr,
46+
admin,
4447
asset,
45-
ISablierV2AirstreamCampaignLL(computedCampaign),
48+
ISablierV2AirstreamCampaignLL(computedCampaignLL),
4649
defaults.IPFS_CID(),
4750
defaults.CAMPAIGN_TOTAL_AMOUNT(),
4851
defaults.RECIPIENTS_COUNT()
4952
);
50-
address actualCampaignLL = address(createAirstreamCampaignLL());
53+
address actualCampaignLL = address(createAirstreamCampaignLL(admin));
5154

52-
ISablierV2AirstreamCampaign[] memory expectedCampaign = campaignFactory.getAirstreamCampaigns(users.admin.addr);
55+
ISablierV2AirstreamCampaign[] memory expectedCampaign = campaignFactory.getAirstreamCampaigns(admin);
5356

5457
assertTrue(actualCampaignLL.code.length > 0, "campaignLL was not created");
55-
assertEq(actualCampaignLL, computedCampaign, "campaignLL address does not match computed address");
58+
assertEq(actualCampaignLL, computedCampaignLL, "campaignLL address does not match computed address");
5659
assertEq(actualCampaignLL, address(expectedCampaign[0]), "campaignLL was not stored in the campaigns mapping");
5760
}
5861
}

test/integration/airstream/campaign-factory/get-airstream-campaigns/getAirstreamCampaigns.t.sol

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,36 @@ import { ISablierV2AirstreamCampaign } from "src/interfaces/ISablierV2AirstreamC
66
import { Integration_Test } from "../../../Integration.t.sol";
77

88
contract GetAirstreamCampaigns_Integration_Test is Integration_Test {
9-
function test_GetAirstreamCampaigns_Empty() external {
10-
ISablierV2AirstreamCampaign[] memory campaigns = campaignFactory.getAirstreamCampaigns(users.admin.addr);
9+
function setUp() public override {
10+
Integration_Test.setUp();
11+
}
12+
13+
function test_GetAirstreamCampaigns_Empty(address admin) external {
14+
vm.assume(admin != users.admin.addr);
15+
ISablierV2AirstreamCampaign[] memory campaigns = campaignFactory.getAirstreamCampaigns(admin);
1116
assertTrue(campaigns.length == 0, "campaigns arrays not empty");
1217
}
1318

1419
function test_GetAirstreamCampaigns_CampaignLD() external {
15-
address expectedCampaignLD = address(createAirstreamCampaignLD());
1620
ISablierV2AirstreamCampaign[] memory campaigns = campaignFactory.getAirstreamCampaigns(users.admin.addr);
17-
address actualCampaignLD = address(campaigns[0]);
21+
address actualCampaignLD = address(campaigns[0]); // `campaignLD` is the first campaign created
22+
address expectedCampaignLD = address(campaignLD);
1823
assertEq(actualCampaignLD, expectedCampaignLD, "getAirstreamCampaigns LD");
1924
}
2025

2126
function test_GetAirstreamCampaigns_CampaignLL() external {
22-
address expectedCampaignLL = address(createAirstreamCampaignLL());
2327
ISablierV2AirstreamCampaign[] memory campaigns = campaignFactory.getAirstreamCampaigns(users.admin.addr);
24-
address actualCampaignLL = address(campaigns[0]);
28+
address actualCampaignLL = address(campaigns[1]); // `campaignLL` is the second campaign created
29+
address expectedCampaignLL = address(campaignLL);
2530
assertEq(actualCampaignLL, expectedCampaignLL, "getAirstreamCampaigns LL");
2631
}
2732

2833
function test_GetAirstreamCampaigns_Campaigns_LD_LL() external {
29-
address expectedCampaignLD = address(createAirstreamCampaignLD());
30-
address expectedCampaignLL = address(createAirstreamCampaignLL());
3134
ISablierV2AirstreamCampaign[] memory campaigns = campaignFactory.getAirstreamCampaigns(users.admin.addr);
3235
address actualCampaignLD = address(campaigns[0]);
3336
address actualCampaignLL = address(campaigns[1]);
37+
address expectedCampaignLD = address(campaignLD);
38+
address expectedCampaignLL = address(campaignLL);
3439
assertEq(actualCampaignLD, expectedCampaignLD, "getAirstreamCampaigns LD");
3540
assertEq(actualCampaignLL, expectedCampaignLL, "getAirstreamCampaigns LL");
3641
}

test/integration/airstream/campaign/ld/CampaignLD.t.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ import { HasClaimed_Integration_Test } from "../has-claimed/hasClaimed.t.sol";
1414
abstract contract CampaignLD_Integration_Test is Integration_Test {
1515
function setUp() public virtual override {
1616
Integration_Test.setUp();
17-
campaign = ISablierV2AirstreamCampaign(createAirstreamCampaignLD());
17+
campaign = ISablierV2AirstreamCampaign(campaignLD);
1818
lockup = ISablierV2Lockup(lockupDynamic);
19-
deal({ token: address(asset), to: address(campaign), give: defaults.CAMPAIGN_TOTAL_AMOUNT() });
20-
vm.label(address(campaign), "Campaign LD");
2119
}
2220
}
2321

test/integration/airstream/campaign/ll/CampaignLL.t.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ import { HasClaimed_Integration_Test } from "../has-claimed/hasClaimed.t.sol";
1414
abstract contract CampaignLL_Integration_Test is Integration_Test {
1515
function setUp() public virtual override {
1616
Integration_Test.setUp();
17-
campaign = ISablierV2AirstreamCampaign(createAirstreamCampaignLL());
17+
campaign = ISablierV2AirstreamCampaign(campaignLL);
1818
lockup = ISablierV2Lockup(lockupLinear);
19-
deal({ token: address(asset), to: address(campaign), give: defaults.CAMPAIGN_TOTAL_AMOUNT() });
20-
vm.label(address(campaign), "campaignLL");
2119
}
2220
}
2321

0 commit comments

Comments
 (0)