Skip to content

Commit

Permalink
test: remove Defaults contract
Browse files Browse the repository at this point in the history
  • Loading branch information
smol-ninja committed Feb 17, 2025
1 parent 203968a commit 1a71030
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 247 deletions.
194 changes: 173 additions & 21 deletions tests/Base.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ 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 { ud2x18 } from "@prb/math/src/UD2x18.sol";
import { ud } from "@prb/math/src/UD60x18.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 { LockupTranched } from "@sablier/lockup/src/types/DataTypes.sol";
import { Merkle } from "murky/src/Merkle.sol";
import { ISablierMerkleBase } from "src/interfaces/ISablierMerkleBase.sol";
import { ISablierMerkleFactory } from "src/interfaces/ISablierMerkleFactory.sol";
Expand All @@ -22,7 +25,6 @@ import { MerkleInstant, MerkleLL, MerkleLT, MerkleVCA } from "src/types/DataType
import { ERC20Mock } from "./mocks/erc20/ERC20Mock.sol";
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";
Expand All @@ -43,7 +45,6 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
//////////////////////////////////////////////////////////////////////////*/

ERC20Mock internal dai;
Defaults internal defaults;
ISablierLockup internal lockup;
ISablierMerkleFactory internal merkleFactory;
ISablierMerkleInstant internal merkleInstant;
Expand All @@ -66,9 +67,6 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
users.admin = payable(makeAddr({ name: "Admin" }));
vm.startPrank({ msgSender: users.admin });

// Deploy the defaults contract.
defaults = new Defaults();

// Deploy the Lockup contract.
LockupNFTDescriptor nftDescriptor = new LockupNFTDescriptor();
lockup = new SablierLockup(users.admin, nftDescriptor, 1000);
Expand All @@ -93,7 +91,7 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
initMerkleTree();

// Set the variables in Modifiers contract.
setVariables(defaults, users);
setVariables(users);

// Set sender as the default caller for the tests.
resetPrank({ msgSender: users.sender });
Expand Down Expand Up @@ -218,25 +216,25 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
}

/*//////////////////////////////////////////////////////////////////////////
HELPERS - MERKLE LOCKUP
MERKLE-INSTANT
//////////////////////////////////////////////////////////////////////////*/

function computeMerkleInstantAddress(
address campaignCreator,
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
IERC20 token_
IERC20 tokenAddress
)
internal
view
returns (address)
{
MerkleInstant.ConstructorParams memory params = defaults.merkleInstantConstructorParams({
MerkleInstant.ConstructorParams memory params = merkleInstantConstructorParams({
campaignOwner: campaignOwner,
expiration: expiration,
merkleRoot: merkleRoot,
token_: token_
tokenAddress: tokenAddress
});

bytes32 salt = keccak256(abi.encodePacked(campaignCreator, abi.encode(params)));
Expand All @@ -261,23 +259,47 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
});
}

function merkleInstantConstructorParams(
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
IERC20 tokenAddress
)
public
view
returns (MerkleInstant.ConstructorParams memory)
{
return MerkleInstant.ConstructorParams({
campaignName: CAMPAIGN_NAME,
expiration: expiration,
initialAdmin: campaignOwner,
ipfsCID: IPFS_CID,
merkleRoot: merkleRoot,
token: tokenAddress
});
}

/*//////////////////////////////////////////////////////////////////////////
MERKLE-LL
//////////////////////////////////////////////////////////////////////////*/

function computeMerkleLLAddress(
address campaignCreator,
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
IERC20 token_
IERC20 tokenAddress
)
internal
view
returns (address)
{
MerkleLL.ConstructorParams memory params = defaults.merkleLLConstructorParams({
MerkleLL.ConstructorParams memory params = merkleLLConstructorParams({
campaignOwner: campaignOwner,
lockup: lockup,
lockupAddress: lockup,
expiration: expiration,
merkleRoot: merkleRoot,
token_: token_
tokenAddress: tokenAddress
});
bytes32 salt = keccak256(abi.encodePacked(campaignCreator, abi.encode(params)));

Expand All @@ -300,23 +322,59 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
});
}

function merkleLLConstructorParams(
address campaignOwner,
uint40 expiration,
ISablierLockup lockupAddress,
bytes32 merkleRoot,
IERC20 tokenAddress
)
public
view
returns (MerkleLL.ConstructorParams memory)
{
return MerkleLL.ConstructorParams({
campaignName: CAMPAIGN_NAME,
cancelable: CANCELABLE,
expiration: expiration,
initialAdmin: campaignOwner,
ipfsCID: IPFS_CID,
lockup: lockupAddress,
merkleRoot: merkleRoot,
schedule: MerkleLL.Schedule({
startTime: ZERO,
startPercentage: START_PERCENTAGE,
cliffDuration: CLIFF_DURATION,
cliffPercentage: CLIFF_PERCENTAGE,
totalDuration: TOTAL_DURATION
}),
shape: SHAPE,
token: tokenAddress,
transferable: TRANSFERABLE
});
}

/*//////////////////////////////////////////////////////////////////////////
MERKLE-LT
//////////////////////////////////////////////////////////////////////////*/

function computeMerkleLTAddress(
address campaignCreator,
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
IERC20 token_
IERC20 tokenAddress
)
internal
view
returns (address)
{
MerkleLT.ConstructorParams memory params = defaults.merkleLTConstructorParams({
MerkleLT.ConstructorParams memory params = merkleLTConstructorParams({
campaignOwner: campaignOwner,
lockup: lockup,
lockupAddress: lockup,
expiration: expiration,
merkleRoot: merkleRoot,
token_: token_
tokenAddress: tokenAddress
});
bytes32 salt = keccak256(abi.encodePacked(campaignCreator, abi.encode(params)));

Expand All @@ -340,24 +398,92 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
});
}

function merkleLTConstructorParams(
address campaignOwner,
uint40 expiration,
ISablierLockup lockupAddress,
bytes32 merkleRoot,
IERC20 tokenAddress
)
public
view
returns (MerkleLT.ConstructorParams memory)
{
MerkleLT.TrancheWithPercentage[] memory tranchesWithPercentages_ = new MerkleLT.TrancheWithPercentage[](2);
tranchesWithPercentages_[0] =
MerkleLT.TrancheWithPercentage({ unlockPercentage: ud2x18(0.2e18), duration: 2 days });
tranchesWithPercentages_[1] =
MerkleLT.TrancheWithPercentage({ unlockPercentage: ud2x18(0.8e18), duration: 8 days });

return MerkleLT.ConstructorParams({
campaignName: CAMPAIGN_NAME,
cancelable: CANCELABLE,
expiration: expiration,
initialAdmin: campaignOwner,
ipfsCID: IPFS_CID,
lockup: lockupAddress,
merkleRoot: merkleRoot,
shape: SHAPE,
streamStartTime: ZERO,
token: tokenAddress,
tranchesWithPercentages: tranchesWithPercentages_,
transferable: TRANSFERABLE
});
}

/// @dev Mirrors the logic from {SablierMerkleLT._calculateStartTimeAndTranches}.
function tranchesMerkleLT(
uint40 streamStartTime,
uint128 totalAmount
)
public
view
returns (LockupTranched.Tranche[] memory tranches_)
{
tranches_ = new LockupTranched.Tranche[](2);
if (streamStartTime == 0) {
tranches_[0].timestamp = uint40(block.timestamp) + CLIFF_DURATION;
tranches_[1].timestamp = uint40(block.timestamp) + TOTAL_DURATION;
} else {
tranches_[0].timestamp = streamStartTime + CLIFF_DURATION;
tranches_[1].timestamp = streamStartTime + TOTAL_DURATION;
}

uint128 amount0 = ud(totalAmount).mul(ud(0.2e18)).intoUint128();
uint128 amount1 = ud(totalAmount).mul(ud(0.8e18)).intoUint128();

tranches_[0].amount = amount0;
tranches_[1].amount = amount1;

uint128 amountsSum = amount0 + amount1;

if (amountsSum != totalAmount) {
tranches_[1].amount += totalAmount - amountsSum;
}
}

/*//////////////////////////////////////////////////////////////////////////
MERKLE-VCA
//////////////////////////////////////////////////////////////////////////*/

function computeMerkleVCAAddress(
address campaignCreator,
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
MerkleVCA.Timestamps memory timestamps,
IERC20 token_
IERC20 tokenAddress
)
internal
view
returns (address)
{
MerkleVCA.ConstructorParams memory params = defaults.merkleVCAConstructorParams({
MerkleVCA.ConstructorParams memory params = merkleVCAConstructorParams({
campaignOwner: campaignOwner,
expiration: expiration,
merkleRoot: merkleRoot,
timestamps: timestamps,
token_: token_
tokenAddress: tokenAddress
});

bytes32 salt = keccak256(abi.encodePacked(campaignCreator, abi.encode(params)));
Expand All @@ -380,4 +506,30 @@ abstract contract Base_Test is Assertions, Constants, DeployOptimized, Merkle, M
deployer: address(merkleFactory)
});
}

function merkleVCAConstructorParams(
address campaignOwner,
uint40 expiration,
bytes32 merkleRoot,
MerkleVCA.Timestamps memory timestamps,
IERC20 tokenAddress
)
public
view
returns (MerkleVCA.ConstructorParams memory)
{
return MerkleVCA.ConstructorParams({
campaignName: CAMPAIGN_NAME,
expiration: expiration,
initialAdmin: campaignOwner,
ipfsCID: IPFS_CID,
merkleRoot: merkleRoot,
timestamps: timestamps,
token: tokenAddress
});
}

function merkleVCATimestamps() public view returns (MerkleVCA.Timestamps memory) {
return MerkleVCA.Timestamps({ start: RANGED_STREAM_START_TIME, end: RANGED_STREAM_END_TIME });
}
}
4 changes: 0 additions & 4 deletions tests/fork/Fork.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { ISablierLockup } from "@sablier/lockup/src/interfaces/ISablierLockup.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 {
Expand Down Expand Up @@ -40,9 +39,6 @@ abstract contract Fork_Test is Base_Test {
// Load the factory admin from mainnet.
factoryAdmin = merkleFactory.admin();

// Initialize the defaults contract.
defaults = new Defaults();

// Set the minimum fee for campaign.
resetPrank({ msgSender: factoryAdmin });
merkleFactory.setMinimumFee(MINIMUM_FEE);
Expand Down
6 changes: 3 additions & 3 deletions tests/fork/merkle-campaign/MerkleInstant.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,14 @@ abstract contract MerkleInstant_Fork_Test is Fork_Test {
campaignOwner: params.campaignOwner,
expiration: params.expiration,
merkleRoot: vars.merkleRoot,
token_: FORK_TOKEN
tokenAddress: FORK_TOKEN
});

vars.params = defaults.merkleInstantConstructorParams({
vars.params = merkleInstantConstructorParams({
campaignOwner: params.campaignOwner,
expiration: params.expiration,
merkleRoot: vars.merkleRoot,
token_: FORK_TOKEN
tokenAddress: FORK_TOKEN
});

vm.expectEmit({ emitter: address(merkleFactory) });
Expand Down
8 changes: 4 additions & 4 deletions tests/fork/merkle-campaign/MerkleLL.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,15 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {
campaignOwner: params.campaignOwner,
expiration: params.expiration,
merkleRoot: vars.merkleRoot,
token_: FORK_TOKEN
tokenAddress: FORK_TOKEN
});

vars.params = defaults.merkleLLConstructorParams({
vars.params = merkleLLConstructorParams({
campaignOwner: params.campaignOwner,
expiration: params.expiration,
lockup: lockup,
lockupAddress: lockup,
merkleRoot: vars.merkleRoot,
token_: FORK_TOKEN
tokenAddress: FORK_TOKEN
});

vm.expectEmit({ emitter: address(merkleFactory) });
Expand Down
Loading

0 comments on commit 1a71030

Please sign in to comment.