Skip to content

Commit

Permalink
feat: allow retroactive campaign
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeNervoXS committed Dec 12, 2024
1 parent bbdc427 commit 1e8debe
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 39 deletions.
2 changes: 0 additions & 2 deletions contracts/DistributionCreator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -524,8 +524,6 @@ contract DistributionCreator is UUPSHelper, ReentrancyGuardUpgradeable {
/// @notice Internal version of `createCampaign`
function _createCampaign(CampaignParameters memory newCampaign) internal returns (bytes32) {
uint256 rewardTokenMinAmount = rewardTokenMinAmounts[newCampaign.rewardToken];
// if epoch parameters lead to a past campaign
if (newCampaign.startTimestamp < block.timestamp) revert Errors.CampaignShouldStartInFuture();
// if the campaign doesn't last at least one hour
if (newCampaign.duration < HOUR) revert Errors.CampaignDurationBelowHour();
// if the reward token is not whitelisted as an incentive token
Expand Down
1 change: 1 addition & 0 deletions lib/forge-std
Submodule forge-std added at 0e7097
1 change: 1 addition & 0 deletions lib/utils
Submodule utils added at d4a8da
94 changes: 57 additions & 37 deletions test/unit/DistributionCreator.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -127,28 +127,6 @@ contract Test_DistributionCreator_Initialize is DistributionCreatorTest {
}

contract Test_DistributionCreator_CreateDistribution is DistributionCreatorTest {
function test_RevertWhen_CampaignShouldStartInFuture() public {
DistributionParameters memory distribution = DistributionParameters({
uniV3Pool: address(pool),
rewardToken: address(angle),
positionWrappers: positionWrappers,
wrapperTypes: wrapperTypes,
amount: 1e10,
propToken0: 4000,
propToken1: 2000,
propFees: 4000,
isOutOfRangeIncentivized: 0,
epochStart: uint32(block.timestamp - 1),
numEpoch: 25,
boostedReward: 0,
boostingAddress: address(0),
rewardId: keccak256("TEST"),
additionalData: hex""
});
vm.expectRevert(Errors.CampaignShouldStartInFuture.selector);
creator.createDistribution(distribution);
}

function test_RevertWhen_CampaignDurationIsZero() public {
DistributionParameters memory distribution = DistributionParameters({
uniV3Pool: address(pool),
Expand Down Expand Up @@ -356,21 +334,6 @@ contract Test_DistributionCreator_CreateDistributions is DistributionCreatorTest
}

contract Test_DistributionCreator_CreateCampaign is DistributionCreatorTest {
function test_RevertWhen_CampaignShouldStartInFuture() public {
CampaignParameters memory campaign = CampaignParameters({
campaignId: keccak256("TEST"),
creator: address(0),
campaignData: hex"ab",
rewardToken: address(angle),
amount: 1e10,
campaignType: 0,
startTimestamp: uint32(block.timestamp - 1),
duration: 3600
});
vm.expectRevert(Errors.CampaignShouldStartInFuture.selector);
creator.createCampaign(campaign);
}

function test_RevertWhen_CampaignDurationIsZero() public {
CampaignParameters memory campaign = CampaignParameters({
campaignId: keccak256("TEST"),
Expand Down Expand Up @@ -479,6 +442,63 @@ contract Test_DistributionCreator_CreateCampaign is DistributionCreatorTest {
assertEq(extraData, fetchedCampaignData);
assertEq(campaignId, fetchedCampaignId);
}

function test_Succeed_CampaignStartInThePast() public {
uint256 amount = 1e8;
CampaignParameters memory campaign = CampaignParameters({
campaignId: keccak256("TEST"),
creator: address(0),
campaignData: hex"ab",
rewardToken: address(angle),
amount: amount,
campaignType: 0,
startTimestamp: uint32(block.timestamp - 1),
duration: 3600
});

vm.prank(alice);
creator.createCampaign(campaign);

address[] memory whitelist = new address[](1);
whitelist[0] = alice;
address[] memory blacklist = new address[](1);
blacklist[0] = charlie;

bytes memory extraData = hex"ab";

// Additional asserts to check for correct behavior
bytes32 campaignId = bytes32(
keccak256(
abi.encodePacked(
block.chainid,
alice,
address(campaign.rewardToken),
uint32(campaign.campaignType),
uint32(campaign.startTimestamp),
uint32(campaign.duration),
campaign.campaignData
)
)
);
(
bytes32 fetchedCampaignId,
address fetchedCreator,
address fetchedRewardToken,
uint256 fetchedAmount,
uint32 fetchedCampaignType,
uint32 fetchedStartTimestamp,
uint32 fetchedDuration,
bytes memory fetchedCampaignData
) = creator.campaignList(creator.campaignLookup(campaignId));
assertEq(alice, fetchedCreator);
assertEq((amount * 9) / 10, fetchedAmount); // amount minus 10% fees
assertEq(address(angle), fetchedRewardToken);
assertEq(campaign.campaignType, fetchedCampaignType);
assertEq(campaign.startTimestamp, fetchedStartTimestamp);
assertEq(campaign.duration, fetchedDuration);
assertEq(extraData, fetchedCampaignData);
assertEq(campaignId, fetchedCampaignId);
}
}

contract Test_DistributionCreator_CreateCampaigns is DistributionCreatorTest {
Expand Down

0 comments on commit 1e8debe

Please sign in to comment.