Skip to content

Commit

Permalink
test(refactor): move all constants into CONSTANT contract
Browse files Browse the repository at this point in the history
test: remove redundant functions from Defaults
  • Loading branch information
smol-ninja committed Feb 15, 2025
1 parent 1a448b2 commit 711e2e6
Show file tree
Hide file tree
Showing 29 changed files with 368 additions and 631 deletions.
55 changes: 47 additions & 8 deletions tests/Base.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
pragma solidity >=0.8.22 <0.9.0;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Arrays } from "@openzeppelin/contracts/utils/Arrays.sol";
import { ISablierLockup } from "@sablier/lockup/src/interfaces/ISablierLockup.sol";
import { LockupNFTDescriptor } from "@sablier/lockup/src/LockupNFTDescriptor.sol";
import { SablierLockup } from "@sablier/lockup/src/SablierLockup.sol";
import { Merkle } from "murky/src/Merkle.sol";
import { ISablierMerkleBase } from "src/interfaces/ISablierMerkleBase.sol";
import { ISablierMerkleFactory } from "src/interfaces/ISablierMerkleFactory.sol";
import { ISablierMerkleInstant } from "src/interfaces/ISablierMerkleInstant.sol";
Expand All @@ -22,11 +24,14 @@ import { Assertions } from "./utils/Assertions.sol";
import { Constants } from "./utils/Constants.sol";
import { Defaults } from "./utils/Defaults.sol";
import { DeployOptimized } from "./utils/DeployOptimized.sol";
import { MerkleBuilder } from "./utils/MerkleBuilder.sol";
import { Modifiers } from "./utils/Modifiers.sol";
import { Users } from "./utils/Types.sol";

/// @notice Base test contract with common logic needed by all tests.
abstract contract Base_Test is Assertions, Constants, DeployOptimized, Modifiers {
abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, Modifiers {
using MerkleBuilder for uint256[];

/*//////////////////////////////////////////////////////////////////////////
VARIABLES
//////////////////////////////////////////////////////////////////////////*/
Expand Down Expand Up @@ -72,7 +77,7 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Modifiers
deployMerkleFactoryConditionally();

// Set the minimum fee on the Merkle factory.
merkleFactory.setMinimumFee(defaults.MINIMUM_FEE());
merkleFactory.setMinimumFee(MINIMUM_FEE);

// Create users for testing.
users.campaignOwner = createUser("CampaignOwner");
Expand All @@ -84,8 +89,8 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Modifiers
users.recipient4 = createUser("Recipient4");
users.sender = createUser("Sender");

defaults.setUsers(users);
defaults.initMerkleTree();
// Initialize the Merkle tree.
initMerkleTree();

// Set the variables in Modifiers contract.
setVariables(defaults, users);
Expand Down Expand Up @@ -127,6 +132,43 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Modifiers
vm.label({ account: address(merkleFactory), newLabel: "MerkleFactory" });
}

/*//////////////////////////////////////////////////////////////////////////
MERKLE-BUILDER
//////////////////////////////////////////////////////////////////////////*/

function index1Proof() public view returns (bytes32[] memory) {
return indexProof(INDEX1, users.recipient1);
}

function index2Proof() public view returns (bytes32[] memory) {
return indexProof(INDEX2, users.recipient2);
}

function index3Proof() public view returns (bytes32[] memory) {
return indexProof(INDEX3, users.recipient3);
}

function index4Proof() public view returns (bytes32[] memory) {
return indexProof(INDEX4, users.recipient4);
}

function indexProof(uint256 index, address recipient) public view returns (bytes32[] memory) {
uint256 leaf = MerkleBuilder.computeLeaf(index, recipient, CLAIM_AMOUNT);
uint256 pos = Arrays.findUpperBound(LEAVES, leaf);
return getProof(LEAVES.toBytes32(), pos);
}

/// @dev We need a separate function to initialize the Merkle tree because, at the construction time, the users are
/// not yet set.
function initMerkleTree() public {
LEAVES[0] = MerkleBuilder.computeLeaf(INDEX1, users.recipient1, CLAIM_AMOUNT);
LEAVES[1] = MerkleBuilder.computeLeaf(INDEX2, users.recipient2, CLAIM_AMOUNT);
LEAVES[2] = MerkleBuilder.computeLeaf(INDEX3, users.recipient3, CLAIM_AMOUNT);
LEAVES[3] = MerkleBuilder.computeLeaf(INDEX4, users.recipient4, CLAIM_AMOUNT);
MerkleBuilder.sortLeaves(LEAVES);
MERKLE_ROOT = getRoot(LEAVES.toBytes32());
}

/*//////////////////////////////////////////////////////////////////////////
CALL EXPECTS - IERC20
//////////////////////////////////////////////////////////////////////////*/
Expand Down Expand Up @@ -171,10 +213,7 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Modifiers
vm.expectCall(
merkleLockup,
msgValue,
abi.encodeCall(
ISablierMerkleBase.claim,
(defaults.INDEX1(), users.recipient1, defaults.CLAIM_AMOUNT(), defaults.index1Proof())
)
abi.encodeCall(ISablierMerkleBase.claim, (INDEX1, users.recipient1, CLAIM_AMOUNT, index1Proof()))
);
}

Expand Down
5 changes: 2 additions & 3 deletions tests/fork/Fork.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ pragma solidity >=0.8.22 <0.9.0;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { ISablierLockup } from "@sablier/lockup/src/interfaces/ISablierLockup.sol";
import { Merkle } from "murky/src/Merkle.sol";

import { Base_Test } from "../Base.t.sol";
import { Defaults } from "../utils/Defaults.sol";

/// @notice Common logic needed by all fork tests.
abstract contract Fork_Test is Base_Test, Merkle {
abstract contract Fork_Test is Base_Test {
/*//////////////////////////////////////////////////////////////////////////
STATE VARIABLES
//////////////////////////////////////////////////////////////////////////*/
Expand Down Expand Up @@ -46,6 +45,6 @@ abstract contract Fork_Test is Base_Test, Merkle {

// Set the minimum fee for campaign.
resetPrank({ msgSender: factoryAdmin });
merkleFactory.setMinimumFee(defaults.MINIMUM_FEE());
merkleFactory.setMinimumFee(MINIMUM_FEE);
}
}
10 changes: 5 additions & 5 deletions tests/fork/merkle-campaign/MerkleInstant.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ abstract contract MerkleInstant_Fork_Test is Fork_Test {
params: vars.params,
aggregateAmount: vars.aggregateAmount,
recipientCount: vars.recipientCount,
fee: defaults.MINIMUM_FEE()
fee: MINIMUM_FEE
});

vars.merkleInstant = merkleFactory.createMerkleInstant(vars.params, vars.aggregateAmount, vars.recipientCount);
Expand Down Expand Up @@ -175,7 +175,7 @@ abstract contract MerkleInstant_Fork_Test is Fork_Test {

expectCallToClaimWithData({
merkleLockup: address(vars.merkleInstant),
fee: defaults.MINIMUM_FEE(),
fee: MINIMUM_FEE,
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
Expand All @@ -188,7 +188,7 @@ abstract contract MerkleInstant_Fork_Test is Fork_Test {
value: vars.amounts[params.posBeforeSort]
});

vars.merkleInstant.claim{ value: defaults.MINIMUM_FEE() }({
vars.merkleInstant.claim{ value: MINIMUM_FEE }({
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
Expand Down Expand Up @@ -226,11 +226,11 @@ abstract contract MerkleInstant_Fork_Test is Fork_Test {
emit ISablierMerkleFactory.CollectFees({
admin: factoryAdmin,
merkleBase: vars.merkleInstant,
feeAmount: defaults.MINIMUM_FEE()
feeAmount: MINIMUM_FEE
});
merkleFactory.collectFees({ merkleBase: vars.merkleInstant });

assertEq(address(vars.merkleInstant).balance, 0, "merkleInstant ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + defaults.MINIMUM_FEE(), "admin ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + MINIMUM_FEE, "admin ETH balance");
}
}
28 changes: 11 additions & 17 deletions tests/fork/merkle-campaign/MerkleLL.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {
params: vars.params,
aggregateAmount: vars.aggregateAmount,
recipientCount: vars.recipientCount,
fee: defaults.MINIMUM_FEE()
fee: MINIMUM_FEE
});

vars.merkleLL = merkleFactory.createMerkleLL(vars.params, vars.aggregateAmount, vars.recipientCount);
Expand Down Expand Up @@ -180,33 +180,31 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {

expectCallToClaimWithData({
merkleLockup: address(vars.merkleLL),
fee: defaults.MINIMUM_FEE(),
fee: MINIMUM_FEE,
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
merkleProof: vars.merkleProof
});

vars.merkleLL.claim{ value: defaults.MINIMUM_FEE() }({
vars.merkleLL.claim{ value: MINIMUM_FEE }({
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
merkleProof: vars.merkleProof
});

vars.expectedUnlockAmounts.start =
ud60x18(vars.amounts[params.posBeforeSort]).mul(defaults.START_PERCENTAGE().intoUD60x18()).intoUint128();
ud60x18(vars.amounts[params.posBeforeSort]).mul(START_PERCENTAGE.intoUD60x18()).intoUint128();
vars.expectedUnlockAmounts.cliff =
ud60x18(vars.amounts[params.posBeforeSort]).mul(defaults.CLIFF_PERCENTAGE().intoUD60x18()).intoUint128();
ud60x18(vars.amounts[params.posBeforeSort]).mul(CLIFF_PERCENTAGE.intoUD60x18()).intoUint128();

// Assert that the stream has been created successfully.
assertEq(
lockup.getCliffTime(vars.expectedStreamId), getBlockTimestamp() + defaults.CLIFF_DURATION(), "cliff time"
);
assertEq(lockup.getCliffTime(vars.expectedStreamId), getBlockTimestamp() + CLIFF_DURATION, "cliff time");
assertEq(
lockup.getDepositedAmount(vars.expectedStreamId), vars.amounts[params.posBeforeSort], "deposited amount"
);
assertEq(lockup.getEndTime(vars.expectedStreamId), getBlockTimestamp() + defaults.TOTAL_DURATION(), "end time");
assertEq(lockup.getEndTime(vars.expectedStreamId), getBlockTimestamp() + TOTAL_DURATION, "end time");
assertEq(lockup.getLockupModel(vars.expectedStreamId), Lockup.Model.LOCKUP_LINEAR);
assertEq(lockup.getRecipient(vars.expectedStreamId), vars.recipients[params.posBeforeSort], "recipient");
assertEq(lockup.getRefundedAmount(vars.expectedStreamId), 0, "refunded amount");
Expand All @@ -224,10 +222,10 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {
"unlock amounts start"
);
assertEq(lockup.getWithdrawnAmount(vars.expectedStreamId), 0, "withdrawn amount");
assertEq(lockup.isCancelable(vars.expectedStreamId), defaults.CANCELABLE(), "is cancelable");
assertEq(lockup.isCancelable(vars.expectedStreamId), CANCELABLE, "is cancelable");
assertEq(lockup.isDepleted(vars.expectedStreamId), false, "is depleted");
assertEq(lockup.isStream(vars.expectedStreamId), true, "is stream");
assertEq(lockup.isTransferable(vars.expectedStreamId), defaults.TRANSFERABLE(), "is transferable");
assertEq(lockup.isTransferable(vars.expectedStreamId), TRANSFERABLE, "is transferable");
assertEq(lockup.wasCanceled(vars.expectedStreamId), false, "was canceled");

assertTrue(vars.merkleLL.hasClaimed(vars.indexes[params.posBeforeSort]));
Expand Down Expand Up @@ -258,14 +256,10 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {
//////////////////////////////////////////////////////////////////////////*/

vm.expectEmit({ emitter: address(merkleFactory) });
emit ISablierMerkleFactory.CollectFees({
admin: factoryAdmin,
merkleBase: vars.merkleLL,
feeAmount: defaults.MINIMUM_FEE()
});
emit ISablierMerkleFactory.CollectFees({ admin: factoryAdmin, merkleBase: vars.merkleLL, feeAmount: MINIMUM_FEE });
merkleFactory.collectFees({ merkleBase: vars.merkleLL });

assertEq(address(vars.merkleLL).balance, 0, "merkleLL ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + defaults.MINIMUM_FEE(), "admin ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + MINIMUM_FEE, "admin ETH balance");
}
}
22 changes: 9 additions & 13 deletions tests/fork/merkle-campaign/MerkleLT.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {
params: vars.params,
aggregateAmount: vars.aggregateAmount,
recipientCount: vars.recipientCount,
totalDuration: defaults.TOTAL_DURATION(),
fee: defaults.MINIMUM_FEE()
totalDuration: TOTAL_DURATION,
fee: MINIMUM_FEE
});

vars.merkleLT = merkleFactory.createMerkleLT(vars.params, vars.aggregateAmount, vars.recipientCount);
Expand Down Expand Up @@ -178,14 +178,14 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {

expectCallToClaimWithData({
merkleLockup: address(vars.merkleLT),
fee: defaults.MINIMUM_FEE(),
fee: MINIMUM_FEE,
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
merkleProof: vars.merkleProof
});

vars.merkleLT.claim{ value: defaults.MINIMUM_FEE() }({
vars.merkleLT.claim{ value: MINIMUM_FEE }({
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
Expand All @@ -196,7 +196,7 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {
assertEq(
lockup.getDepositedAmount(vars.expectedStreamId), vars.amounts[params.posBeforeSort], "deposited amount"
);
assertEq(lockup.getEndTime(vars.expectedStreamId), getBlockTimestamp() + defaults.TOTAL_DURATION(), "end time");
assertEq(lockup.getEndTime(vars.expectedStreamId), getBlockTimestamp() + TOTAL_DURATION, "end time");
assertEq(lockup.getLockupModel(vars.expectedStreamId), Lockup.Model.LOCKUP_TRANCHED);
assertEq(lockup.getRecipient(vars.expectedStreamId), vars.recipients[params.posBeforeSort], "recipient");
assertEq(lockup.getRefundedAmount(vars.expectedStreamId), 0, "refunded amount");
Expand All @@ -208,10 +208,10 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {
);
assertEq(lockup.getUnderlyingToken(vars.expectedStreamId), FORK_TOKEN, "token");
assertEq(lockup.getWithdrawnAmount(vars.expectedStreamId), 0, "withdrawn amount");
assertEq(lockup.isCancelable(vars.expectedStreamId), defaults.CANCELABLE(), "is cancelable");
assertEq(lockup.isCancelable(vars.expectedStreamId), CANCELABLE, "is cancelable");
assertEq(lockup.isDepleted(vars.expectedStreamId), false, "is depleted");
assertEq(lockup.isStream(vars.expectedStreamId), true, "is stream");
assertEq(lockup.isTransferable(vars.expectedStreamId), defaults.TRANSFERABLE(), "is transferable");
assertEq(lockup.isTransferable(vars.expectedStreamId), TRANSFERABLE, "is transferable");
assertEq(lockup.wasCanceled(vars.expectedStreamId), false, "was canceled");

assertTrue(vars.merkleLT.hasClaimed(vars.indexes[params.posBeforeSort]));
Expand Down Expand Up @@ -243,14 +243,10 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {
//////////////////////////////////////////////////////////////////////////*/

vm.expectEmit({ emitter: address(merkleFactory) });
emit ISablierMerkleFactory.CollectFees({
admin: factoryAdmin,
merkleBase: vars.merkleLT,
feeAmount: defaults.MINIMUM_FEE()
});
emit ISablierMerkleFactory.CollectFees({ admin: factoryAdmin, merkleBase: vars.merkleLT, feeAmount: MINIMUM_FEE });
merkleFactory.collectFees({ merkleBase: vars.merkleLT });

assertEq(address(vars.merkleLT).balance, 0, "merkleLT ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + defaults.MINIMUM_FEE(), "admin ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + MINIMUM_FEE, "admin ETH balance");
}
}
10 changes: 5 additions & 5 deletions tests/fork/merkle-campaign/MerkleVCA.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ abstract contract MerkleVCA_Fork_Test is Fork_Test {
params: vars.params,
aggregateAmount: vars.aggregateAmount,
recipientCount: vars.recipientCount,
fee: defaults.MINIMUM_FEE()
fee: MINIMUM_FEE
});

vars.merkleVCA = merkleFactory.createMerkleVCA(vars.params, vars.aggregateAmount, vars.recipientCount);
Expand Down Expand Up @@ -195,7 +195,7 @@ abstract contract MerkleVCA_Fork_Test is Fork_Test {

expectCallToClaimWithData({
merkleLockup: address(vars.merkleVCA),
fee: defaults.MINIMUM_FEE(),
fee: MINIMUM_FEE,
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
Expand All @@ -208,7 +208,7 @@ abstract contract MerkleVCA_Fork_Test is Fork_Test {
value: vars.claimableAmount
});

vars.merkleVCA.claim{ value: defaults.MINIMUM_FEE() }({
vars.merkleVCA.claim{ value: MINIMUM_FEE }({
index: vars.indexes[params.posBeforeSort],
recipient: vars.recipients[params.posBeforeSort],
amount: vars.amounts[params.posBeforeSort],
Expand Down Expand Up @@ -246,11 +246,11 @@ abstract contract MerkleVCA_Fork_Test is Fork_Test {
emit ISablierMerkleFactory.CollectFees({
admin: factoryAdmin,
merkleBase: vars.merkleVCA,
feeAmount: defaults.MINIMUM_FEE()
feeAmount: MINIMUM_FEE
});
merkleFactory.collectFees({ merkleBase: vars.merkleVCA });

assertEq(address(vars.merkleVCA).balance, 0, "merkleVCA ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + defaults.MINIMUM_FEE(), "admin ETH balance");
assertEq(factoryAdmin.balance, initialAdminBalance + MINIMUM_FEE, "admin ETH balance");
}
}
Loading

0 comments on commit 711e2e6

Please sign in to comment.