Skip to content

Commit

Permalink
refactor: use CREATE instead of CREATE2 (#339)
Browse files Browse the repository at this point in the history
* refactor: use CREATE instead of CREATE2

* test: use vm.computeCreateAddress instead

---------

Co-authored-by: andreivladbrg <andreivladbrg@gmail.com>
  • Loading branch information
smol-ninja and andreivladbrg committed May 3, 2024
1 parent 502bacc commit 1bf91e6
Show file tree
Hide file tree
Showing 12 changed files with 67 additions and 317 deletions.
92 changes: 45 additions & 47 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,55 +1,53 @@
BaseScript_Test:test_ConstructCreate2Salt() (gas: 18701)
Claim_Integration_Test:test_Claim() (gas: 296792)
Claim_Integration_Test:test_Claim() (gas: 359541)
Claim_Integration_Test:test_Claim_CalculatedAmountsSumNotEqualClaimAmount() (gas: 1906979)
Claim_Integration_Test:test_RevertGiven_AlreadyClaimed() (gas: 274624)
Claim_Integration_Test:test_RevertGiven_AlreadyClaimed() (gas: 329502)
Claim_Integration_Test:test_RevertGiven_CampaignExpired() (gas: 17786)
Claim_Integration_Test:test_RevertGiven_CampaignExpired() (gas: 17811)
Clawback_Integration_Test:testFuzz_Clawback(address) (runs: 38, μ: 295825, ~: 295825)
Clawback_Integration_Test:testFuzz_Clawback(address) (runs: 38, μ: 350750, ~: 350750)
Clawback_Integration_Test:test_Clawback() (gas: 278339)
Clawback_Integration_Test:test_Clawback() (gas: 333264)
Clawback_Integration_Test:test_RevertGiven_CampaignNotExpired() (gas: 19523)
Clawback_Integration_Test:test_RevertGiven_CampaignNotExpired() (gas: 19523)
Constructor_MerkleLL_Integration_Test:test_Constructor() (gas: 1150963)
Constructor_MerkleLT_Integration_Test:test_Constructor() (gas: 1495600)
CreateMerkleLL_Integration_Test:testFuzz_CreateMerkleLL(address,uint40) (runs: 38, μ: 1122843, ~: 1123367)
CreateMerkleLL_Integration_Test:test_RevertGiven_CreatedAlready() (gas: 8937393460516730662)
CreateMerkleLT_Integration_Test:testFuzz_CreateMerkleLT(address,uint40) (runs: 38, μ: 1431123, ~: 1431123)
CreateMerkleLT_Integration_Test:test_RevertGiven_CreatedAlready() (gas: 8937393460516730766)
CreateWithDurationsLD_Integration_Test:test_BatchCreateWithDurations() (gas: 2021956)
CreateWithDurationsLL_Integration_Test:test_BatchCreateWithDurations() (gas: 1498705)
CreateWithDurationsLT_Integration_Test:test_BatchCreateWithDurations() (gas: 2007334)
CreateWithTimestampsLD_Integration_Test:test_BatchCreateWithTimestamps() (gas: 2005042)
CreateWithTimestampsLL_Integration_Test:test_BatchCreateWithTimestamps() (gas: 1497928)
CreateWithTimestampsLT_Integration_Test:test_BatchCreateWithTimestamps() (gas: 1991536)
HasClaimed_Integration_Test:test_HasClaimed() (gas: 263197)
HasClaimed_Integration_Test:test_HasClaimed() (gas: 318100)
BaseScript_Test:test_ConstructCreate2Salt() (gas: 29789)
Claim_Integration_Test:test_Claim() (gas: 296791)
Claim_Integration_Test:test_Claim() (gas: 359475)
Claim_Integration_Test:test_Claim_CalculatedAmountsSumNotEqualClaimAmount() (gas: 1902438)
Claim_Integration_Test:test_RevertGiven_AlreadyClaimed() (gas: 274580)
Claim_Integration_Test:test_RevertGiven_AlreadyClaimed() (gas: 329458)
Claim_Integration_Test:test_RevertGiven_CampaignExpired() (gas: 17764)
Claim_Integration_Test:test_RevertGiven_CampaignExpired() (gas: 17789)
Clawback_Integration_Test:testFuzz_Clawback(address) (runs: 28, μ: 295781, ~: 295781)
Clawback_Integration_Test:testFuzz_Clawback(address) (runs: 28, μ: 350706, ~: 350706)
Clawback_Integration_Test:test_Clawback() (gas: 278295)
Clawback_Integration_Test:test_Clawback() (gas: 333220)
Clawback_Integration_Test:test_RevertGiven_CampaignNotExpired() (gas: 19501)
Clawback_Integration_Test:test_RevertGiven_CampaignNotExpired() (gas: 19501)
Constructor_MerkleLL_Integration_Test:test_Constructor() (gas: 1150927)
Constructor_MerkleLT_Integration_Test:test_Constructor() (gas: 1495564)
CreateMerkleLL_Integration_Test:testFuzz_CreateMerkleLL(address,uint40) (runs: 28, μ: 1074513, ~: 1074513)
CreateMerkleLT_Integration_Test:testFuzz_CreateMerkleLT(address,uint40) (runs: 28, μ: 1368933, ~: 1368933)
CreateWithDurationsLD_Integration_Test:test_BatchCreateWithDurations() (gas: 2021978)
CreateWithDurationsLL_Integration_Test:test_BatchCreateWithDurations() (gas: 1498683)
CreateWithDurationsLT_Integration_Test:test_BatchCreateWithDurations() (gas: 2007290)
CreateWithTimestampsLD_Integration_Test:test_BatchCreateWithTimestamps() (gas: 2005062)
CreateWithTimestampsLL_Integration_Test:test_BatchCreateWithTimestamps() (gas: 1498016)
CreateWithTimestampsLT_Integration_Test:test_BatchCreateWithTimestamps() (gas: 1991514)
HasClaimed_Integration_Test:test_HasClaimed() (gas: 263153)
HasClaimed_Integration_Test:test_HasClaimed() (gas: 318056)
HasClaimed_Integration_Test:test_HasClaimed_IndexNotInTree() (gas: 11174)
HasClaimed_Integration_Test:test_HasClaimed_IndexNotInTree() (gas: 11196)
HasClaimed_Integration_Test:test_HasClaimed_NotClaimed() (gas: 16387)
HasClaimed_Integration_Test:test_HasClaimed_NotClaimed() (gas: 16409)
HasClaimed_Integration_Test:test_HasClaimed_NotClaimed() (gas: 16431)
HasExpired_Integration_Test:test_HasExpired_ExpirationEqualToBlockTimestamp() (gas: 14670)
HasExpired_Integration_Test:test_HasExpired_ExpirationEqualToBlockTimestamp() (gas: 14692)
HasExpired_Integration_Test:test_HasExpired_ExpirationEqualToBlockTimestamp() (gas: 14714)
HasExpired_Integration_Test:test_HasExpired_ExpirationGreaterThanBlockTimestamp() (gas: 14766)
HasExpired_Integration_Test:test_HasExpired_ExpirationGreaterThanBlockTimestamp() (gas: 14788)
HasExpired_Integration_Test:test_HasExpired_ExpirationGreaterThanBlockTimestamp() (gas: 14810)
HasExpired_Integration_Test:test_HasExpired_ExpirationLessThanBlockTimestamp() (gas: 8902)
HasExpired_Integration_Test:test_HasExpired_ExpirationLessThanBlockTimestamp() (gas: 8924)
HasExpired_Integration_Test:test_HasExpired_ExpirationZero() (gas: 1051899)
HasExpired_Integration_Test:test_HasExpired_ExpirationZero() (gas: 1343143)
MerkleBuilder_Test:testFuzz_ComputeLeaf(uint256,address,uint128) (runs: 38, μ: 4323, ~: 4323)
MerkleBuilder_Test:testFuzz_ComputeLeaves((uint256,address,uint128)[]) (runs: 38, μ: 366364, ~: 398189)
HasExpired_Integration_Test:test_HasExpired_ExpirationZero() (gas: 1053478)
HasExpired_Integration_Test:test_HasExpired_ExpirationZero() (gas: 1343750)
MerkleBuilder_Test:testFuzz_ComputeLeaf(uint256,address,uint128) (runs: 28, μ: 4323, ~: 4323)
MerkleBuilder_Test:testFuzz_ComputeLeaves((uint256,address,uint128)[]) (runs: 28, μ: 292561, ~: 288103)
Precompiles_Test:test_DeployBatchLockup() (gas: 3323914)
Precompiles_Test:test_DeployMerkleLockupFactory() (gas: 6986949)
Precompiles_Test:test_DeployPeriphery() (gas: 10310682)
USDC_CreateWithTimestamps_LockupDynamic_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLD((uint128,address,address,uint128,uint40,(uint128,uint64,uint40)[])) (runs: 38, μ: 34210026, ~: 30903106)
USDC_CreateWithTimestamps_LockupLinear_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLL((uint128,(uint40,uint40,uint40),address,address,uint128)) (runs: 38, μ: 1592674, ~: 1502438)
USDC_CreateWithTimestamps_LockupTranched_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLT((uint128,address,address,uint128,uint40,(uint128,uint40)[])) (runs: 36, μ: 24927469, ~: 23804750)
USDC_MerkleLL_Fork_Test:testForkFuzz_MerkleLL((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 38, μ: 5247542, ~: 5027798)
USDC_MerkleLT_Fork_Test:testForkFuzz_MerkleLT((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 38, μ: 5622048, ~: 5399736)
USDT_CreateWithTimestamps_LockupDynamic_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLD((uint128,address,address,uint128,uint40,(uint128,uint64,uint40)[])) (runs: 38, μ: 30978443, ~: 21899958)
USDT_CreateWithTimestamps_LockupLinear_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLL((uint128,(uint40,uint40,uint40),address,address,uint128)) (runs: 38, μ: 1953484, ~: 2211406)
USDT_CreateWithTimestamps_LockupTranched_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLT((uint128,address,address,uint128,uint40,(uint128,uint40)[])) (runs: 38, μ: 27146173, ~: 17675525)
USDT_MerkleLL_Fork_Test:testForkFuzz_MerkleLL((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 38, μ: 5214786, ~: 4997326)
USDT_MerkleLT_Fork_Test:testForkFuzz_MerkleLT((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 38, μ: 5585576, ~: 5365241)
Precompiles_Test:test_DeployMerkleLockupFactory() (gas: 6699573)
Precompiles_Test:test_DeployPeriphery() (gas: 10022773)
USDC_CreateWithTimestamps_LockupDynamic_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLD((uint128,address,address,uint128,uint40,(uint128,uint64,uint40)[])) (runs: 28, μ: 35637382, ~: 36910130)
USDC_CreateWithTimestamps_LockupLinear_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLL((uint128,(uint40,uint40,uint40),address,address,uint128)) (runs: 28, μ: 1731234, ~: 2052336)
USDC_CreateWithTimestamps_LockupTranched_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLT((uint128,address,address,uint128,uint40,(uint128,uint40)[])) (runs: 28, μ: 32364663, ~: 14997747)
USDC_MerkleLL_Fork_Test:testForkFuzz_MerkleLL((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 28, μ: 6023356, ~: 6239037)
USDC_MerkleLT_Fork_Test:testForkFuzz_MerkleLT((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 28, μ: 6380188, ~: 6588339)
USDT_CreateWithTimestamps_LockupDynamic_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLD((uint128,address,address,uint128,uint40,(uint128,uint64,uint40)[])) (runs: 28, μ: 32017272, ~: 28939343)
USDT_CreateWithTimestamps_LockupLinear_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLL((uint128,(uint40,uint40,uint40),address,address,uint128)) (runs: 28, μ: 1776276, ~: 1948060)
USDT_CreateWithTimestamps_LockupTranched_BatchLockup_Fork_Test:testForkFuzz_CreateWithTimestampsLT((uint128,address,address,uint128,uint40,(uint128,uint40)[])) (runs: 28, μ: 32063121, ~: 16796582)
USDT_MerkleLL_Fork_Test:testForkFuzz_MerkleLL((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 28, μ: 5989767, ~: 6205276)
USDT_MerkleLT_Fork_Test:testForkFuzz_MerkleLT((address,uint40,(uint256,uint256,uint128)[],uint256)) (runs: 28, μ: 6345991, ~: 6556943)
2 changes: 1 addition & 1 deletion precompiles/Precompiles.sol

Large diffs are not rendered by default.

40 changes: 4 additions & 36 deletions src/SablierV2MerkleLockupFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,8 @@ contract SablierV2MerkleLockupFactory is ISablierV2MerkleLockupFactory {
external
returns (ISablierV2MerkleLL merkleLL)
{
// Hash the parameters to generate a salt.
bytes32 salt = keccak256(
abi.encodePacked(
baseParams.asset,
baseParams.cancelable,
baseParams.expiration,
baseParams.initialAdmin,
abi.encode(baseParams.ipfsCID),
baseParams.merkleRoot,
bytes32(abi.encodePacked(baseParams.name)),
baseParams.transferable,
lockupLinear,
abi.encode(streamDurations)
)
);

// Deploy the MerkleLockup contract with CREATE2.
merkleLL = new SablierV2MerkleLL{ salt: salt }(baseParams, lockupLinear, streamDurations);
// Deploy the MerkleLockup contract with CREATE.
merkleLL = new SablierV2MerkleLL(baseParams, lockupLinear, streamDurations);

// Log the creation of the MerkleLockup contract, including some metadata that is not stored on-chain.
emit CreateMerkleLL(merkleLL, baseParams, lockupLinear, streamDurations, aggregateAmount, recipientCount);
Expand Down Expand Up @@ -83,24 +67,8 @@ contract SablierV2MerkleLockupFactory is ISablierV2MerkleLockupFactory {
revert Errors.SablierV2MerkleLockupFactory_TotalPercentageNotOneHundred(totalPercentage);
}

// Hash the parameters to generate a salt.
bytes32 salt = keccak256(
abi.encodePacked(
baseParams.asset,
baseParams.cancelable,
baseParams.expiration,
baseParams.initialAdmin,
abi.encode(baseParams.ipfsCID),
baseParams.merkleRoot,
bytes32(abi.encodePacked(baseParams.name)),
baseParams.transferable,
lockupTranched,
abi.encode(tranchesWithPercentages)
)
);

// Deploy the MerkleLockup contract with CREATE2.
merkleLT = new SablierV2MerkleLT{ salt: salt }(baseParams, lockupTranched, tranchesWithPercentages);
// Deploy the MerkleLockup contract with CREATE.
merkleLT = new SablierV2MerkleLT(baseParams, lockupTranched, tranchesWithPercentages);

// Log the creation of the MerkleLockup contract, including some metadata that is not stored on-chain.
emit CreateMerkleLT(
Expand Down
2 changes: 1 addition & 1 deletion src/interfaces/ISablierV2MerkleLockupFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { ISablierV2MerkleLT } from "./ISablierV2MerkleLT.sol";
import { MerkleLockup, MerkleLT } from "../types/DataTypes.sol";

/// @title ISablierV2MerkleLockupFactory
/// @notice Deploys MerkleLockup campaigns with CREATE2.
/// @notice Deploys MerkleLockup campaigns with CREATE.
interface ISablierV2MerkleLockupFactory {
/*//////////////////////////////////////////////////////////////////////////
EVENTS
Expand Down
138 changes: 1 addition & 137 deletions test/Base.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ import { ISablierV2MerkleLL } from "src/interfaces/ISablierV2MerkleLL.sol";
import { ISablierV2MerkleLockupFactory } from "src/interfaces/ISablierV2MerkleLockupFactory.sol";
import { ISablierV2MerkleLT } from "src/interfaces/ISablierV2MerkleLT.sol";
import { SablierV2BatchLockup } from "src/SablierV2BatchLockup.sol";
import { SablierV2MerkleLL } from "src/SablierV2MerkleLL.sol";
import { SablierV2MerkleLockupFactory } from "src/SablierV2MerkleLockupFactory.sol";
import { SablierV2MerkleLT } from "src/SablierV2MerkleLT.sol";

import { ERC20Mock } from "./mocks/erc20/ERC20Mock.sol";
import { Assertions } from "./utils/Assertions.sol";
Expand Down Expand Up @@ -57,6 +55,7 @@ abstract contract Base_Test is
ISablierV2LockupLinear internal lockupLinear;
ISablierV2LockupTranched internal lockupTranched;
ISablierV2MerkleLockupFactory internal merkleLockupFactory;
uint256 internal merkleLockupFactoryNonce;
ISablierV2MerkleLL internal merkleLL;
ISablierV2MerkleLT internal merkleLT;

Expand Down Expand Up @@ -257,139 +256,4 @@ abstract contract Base_Test is
{
vm.expectCall({ callee: asset_, count: count, data: abi.encodeCall(IERC20.transferFrom, (from, to, amount)) });
}

/*//////////////////////////////////////////////////////////////////////////
MERKLE-LOCKUP
//////////////////////////////////////////////////////////////////////////*/

function computeMerkleLLAddress(
address admin,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (address)
{
return computeMerkleLLAddress(admin, dai, merkleRoot, expiration);
}

function computeMerkleLLAddress(
address admin,
IERC20 asset_,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (address)
{
bytes32 salt = keccak256(
abi.encodePacked(
address(asset_),
defaults.CANCELABLE(),
expiration,
admin,
abi.encode(defaults.IPFS_CID()),
merkleRoot,
defaults.NAME_BYTES32(),
defaults.TRANSFERABLE(),
lockupLinear,
abi.encode(defaults.durations())
)
);
bytes32 creationBytecodeHash = keccak256(getMerkleLLBytecode(admin, asset_, merkleRoot, expiration));
return computeCreate2Address({
salt: salt,
initcodeHash: creationBytecodeHash,
deployer: address(merkleLockupFactory)
});
}

function computeMerkleLTAddress(
address admin,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (address)
{
return computeMerkleLTAddress(admin, dai, merkleRoot, expiration);
}

function computeMerkleLTAddress(
address admin,
IERC20 asset_,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (address)
{
bytes32 salt = keccak256(
abi.encodePacked(
address(asset_),
defaults.CANCELABLE(),
expiration,
admin,
abi.encode(defaults.IPFS_CID()),
merkleRoot,
defaults.NAME_BYTES32(),
defaults.TRANSFERABLE(),
lockupTranched,
abi.encode(defaults.tranchesWithPercentages())
)
);
bytes32 creationBytecodeHash = keccak256(getMerkleLTBytecode(admin, asset_, merkleRoot, expiration));
return computeCreate2Address({
salt: salt,
initcodeHash: creationBytecodeHash,
deployer: address(merkleLockupFactory)
});
}

function getMerkleLLBytecode(
address admin,
IERC20 asset_,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (bytes memory)
{
bytes memory constructorArgs =
abi.encode(defaults.baseParams(admin, asset_, expiration, merkleRoot), lockupLinear, defaults.durations());
if (!isTestOptimizedProfile()) {
return bytes.concat(type(SablierV2MerkleLL).creationCode, constructorArgs);
} else {
return
bytes.concat(vm.getCode("out-optimized/SablierV2MerkleLL.sol/SablierV2MerkleLL.json"), constructorArgs);
}
}

function getMerkleLTBytecode(
address admin,
IERC20 asset_,
bytes32 merkleRoot,
uint40 expiration
)
internal
view
returns (bytes memory)
{
bytes memory constructorArgs = abi.encode(
defaults.baseParams(admin, asset_, expiration, merkleRoot),
lockupTranched,
defaults.tranchesWithPercentages()
);
if (!isTestOptimizedProfile()) {
return bytes.concat(type(SablierV2MerkleLT).creationCode, constructorArgs);
} else {
return
bytes.concat(vm.getCode("out-optimized/SablierV2MerkleLT.sol/SablierV2MerkleLT.json"), constructorArgs);
}
}
}
2 changes: 1 addition & 1 deletion test/fork/merkle-lockup/MerkleLL.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ abstract contract MerkleLL_Fork_Test is Fork_Test {
MerkleBuilder.sortLeaves(leaves);
vars.merkleRoot = getRoot(leaves.toBytes32());

vars.expectedLL = computeMerkleLLAddress(params.admin, FORK_ASSET, vars.merkleRoot, params.expiration);
vars.expectedLL = vm.computeCreateAddress(address(merkleLockupFactory), ++merkleLockupFactoryNonce);

vars.baseParams = defaults.baseParams({
admin: params.admin,
Expand Down
2 changes: 1 addition & 1 deletion test/fork/merkle-lockup/MerkleLT.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ abstract contract MerkleLT_Fork_Test is Fork_Test {
MerkleBuilder.sortLeaves(leaves);
vars.merkleRoot = getRoot(leaves.toBytes32());

vars.expectedLT = computeMerkleLTAddress(params.admin, FORK_ASSET, vars.merkleRoot, params.expiration);
vars.expectedLT = vm.computeCreateAddress(address(merkleLockupFactory), ++merkleLockupFactoryNonce);

vars.baseParams = defaults.baseParams({
admin: params.admin,
Expand Down
Loading

0 comments on commit 1bf91e6

Please sign in to comment.