Skip to content

Commit 74b784a

Browse files
committed
fix: tests
1 parent fc63e80 commit 74b784a

File tree

2 files changed

+231
-5
lines changed

2 files changed

+231
-5
lines changed

contracts/DistributionCreator.sol

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,11 @@ contract DistributionCreator is UUPSHelper, ReentrancyGuardUpgradeable {
513513
uint256 campaignAmountMinusFees
514514
) internal {
515515
uint256 fees = campaignAmount - campaignAmountMinusFees;
516-
address _feeRecipient = feeRecipient;
517-
_feeRecipient = _feeRecipient == address(0) ? address(this) : _feeRecipient;
516+
address _feeRecipient;
517+
if (fees > 0) {
518+
_feeRecipient = feeRecipient;
519+
_feeRecipient = _feeRecipient == address(0) ? address(this) : _feeRecipient;
520+
}
518521
uint256 userBalance = creatorBalance[creator][rewardToken];
519522
if (userBalance >= campaignAmount) {
520523
if (msg.sender != creator) {
@@ -528,7 +531,7 @@ contract DistributionCreator is UUPSHelper, ReentrancyGuardUpgradeable {
528531
}
529532
}
530533
_updateBalance(creator, rewardToken, userBalance - campaignAmount);
531-
if (fees > 0) IERC20(rewardToken).safeTransfer(_feeRecipient, fees);
534+
if (fees > 0 && _feeRecipient != address(this)) IERC20(rewardToken).safeTransfer(_feeRecipient, fees);
532535
IERC20(rewardToken).safeTransfer(distributor, campaignAmountMinusFees);
533536
} else {
534537
if (fees > 0) IERC20(rewardToken).safeTransferFrom(msg.sender, _feeRecipient, fees);

test/unit/DistributionCreator.t.sol

Lines changed: 225 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,229 @@ contract Test_DistributionCreator_CreateCampaign is DistributionCreatorTest {
428428
assertEq(extraData, fetchedCampaignData);
429429
assertEq(campaignId, fetchedCampaignId);
430430
}
431+
432+
function test_SuccessFromPreDepositedBalance() public {
433+
uint256 amount = 1e8;
434+
CampaignParameters memory campaign = CampaignParameters({
435+
campaignId: keccak256("TEST"),
436+
creator: address(alice),
437+
campaignData: hex"ab",
438+
rewardToken: address(angle),
439+
amount: amount,
440+
campaignType: 0,
441+
startTimestamp: uint32(block.timestamp + 1),
442+
duration: 3600
443+
});
444+
445+
vm.prank(governor);
446+
creator.setFeeRecipient(dylan);
447+
448+
{
449+
vm.startPrank(alice);
450+
creator.increaseTokenBalance(alice, address(angle), 1e10);
451+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10);
452+
address distributor = creator.distributor();
453+
uint256 balance = angle.balanceOf(address(alice));
454+
uint256 creatorBalance = angle.balanceOf(address(creator));
455+
uint256 distributorBalance = angle.balanceOf(address(distributor));
456+
uint256 fees = creator.defaultFees();
457+
creator.createCampaign(campaign);
458+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10 - amount);
459+
assertEq(angle.balanceOf(address(alice)), balance);
460+
assertEq(angle.balanceOf(address(creator)), creatorBalance - amount);
461+
assertEq(angle.balanceOf(address(dylan)), (amount * fees) / 1e9);
462+
assertEq(angle.balanceOf(address(distributor)), distributorBalance + amount - ((amount * fees) / 1e9));
463+
}
464+
465+
address[] memory whitelist = new address[](1);
466+
whitelist[0] = alice;
467+
address[] memory blacklist = new address[](1);
468+
blacklist[0] = charlie;
469+
470+
bytes memory extraData = hex"ab";
471+
472+
// Additional asserts to check for correct behavior
473+
bytes32 campaignId = bytes32(
474+
keccak256(
475+
abi.encodePacked(
476+
block.chainid,
477+
alice,
478+
address(campaign.rewardToken),
479+
uint32(campaign.campaignType),
480+
uint32(campaign.startTimestamp),
481+
uint32(campaign.duration),
482+
campaign.campaignData
483+
)
484+
)
485+
);
486+
(
487+
bytes32 fetchedCampaignId,
488+
address fetchedCreator,
489+
address fetchedRewardToken,
490+
uint256 fetchedAmount,
491+
uint32 fetchedCampaignType,
492+
uint32 fetchedStartTimestamp,
493+
uint32 fetchedDuration,
494+
bytes memory fetchedCampaignData
495+
) = creator.campaignList(creator.campaignLookup(campaignId));
496+
assertEq(alice, fetchedCreator);
497+
assertEq((amount * 9) / 10, fetchedAmount); // amount minus 10% fees
498+
assertEq(address(angle), fetchedRewardToken);
499+
assertEq(campaign.campaignType, fetchedCampaignType);
500+
assertEq(campaign.startTimestamp, fetchedStartTimestamp);
501+
assertEq(campaign.duration, fetchedDuration);
502+
assertEq(extraData, fetchedCampaignData);
503+
assertEq(campaignId, fetchedCampaignId);
504+
}
505+
506+
function test_SuccessFromPreDepositedBalanceWithNoFeeRecipient() public {
507+
uint256 amount = 1e8;
508+
CampaignParameters memory campaign = CampaignParameters({
509+
campaignId: keccak256("TEST"),
510+
creator: address(alice),
511+
campaignData: hex"ab",
512+
rewardToken: address(angle),
513+
amount: amount,
514+
campaignType: 0,
515+
startTimestamp: uint32(block.timestamp + 1),
516+
duration: 3600
517+
});
518+
519+
vm.prank(governor);
520+
creator.setFeeRecipient(address(0));
521+
522+
{
523+
vm.startPrank(alice);
524+
creator.increaseTokenBalance(alice, address(angle), 1e10);
525+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10);
526+
address distributor = creator.distributor();
527+
uint256 balance = angle.balanceOf(address(alice));
528+
uint256 creatorBalance = angle.balanceOf(address(creator));
529+
uint256 distributorBalance = angle.balanceOf(address(distributor));
530+
uint256 fees = creator.defaultFees();
531+
creator.createCampaign(campaign);
532+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10 - amount);
533+
assertEq(angle.balanceOf(address(alice)), balance);
534+
assertEq(angle.balanceOf(address(creator)), creatorBalance - amount + ((amount * fees) / 1e9));
535+
assertEq(angle.balanceOf(address(distributor)), distributorBalance + amount - ((amount * fees) / 1e9));
536+
}
537+
538+
address[] memory whitelist = new address[](1);
539+
whitelist[0] = alice;
540+
address[] memory blacklist = new address[](1);
541+
blacklist[0] = charlie;
542+
543+
bytes memory extraData = hex"ab";
544+
545+
// Additional asserts to check for correct behavior
546+
bytes32 campaignId = bytes32(
547+
keccak256(
548+
abi.encodePacked(
549+
block.chainid,
550+
alice,
551+
address(campaign.rewardToken),
552+
uint32(campaign.campaignType),
553+
uint32(campaign.startTimestamp),
554+
uint32(campaign.duration),
555+
campaign.campaignData
556+
)
557+
)
558+
);
559+
(
560+
bytes32 fetchedCampaignId,
561+
address fetchedCreator,
562+
address fetchedRewardToken,
563+
uint256 fetchedAmount,
564+
uint32 fetchedCampaignType,
565+
uint32 fetchedStartTimestamp,
566+
uint32 fetchedDuration,
567+
bytes memory fetchedCampaignData
568+
) = creator.campaignList(creator.campaignLookup(campaignId));
569+
assertEq(alice, fetchedCreator);
570+
assertEq((amount * 9) / 10, fetchedAmount); // amount minus 10% fees
571+
assertEq(address(angle), fetchedRewardToken);
572+
assertEq(campaign.campaignType, fetchedCampaignType);
573+
assertEq(campaign.startTimestamp, fetchedStartTimestamp);
574+
assertEq(campaign.duration, fetchedDuration);
575+
assertEq(extraData, fetchedCampaignData);
576+
assertEq(campaignId, fetchedCampaignId);
577+
}
578+
579+
function test_SuccessFromPreDepositedBalanceWithNoFees() public {
580+
uint256 amount = 1e8;
581+
CampaignParameters memory campaign = CampaignParameters({
582+
campaignId: keccak256("TEST"),
583+
creator: address(alice),
584+
campaignData: hex"ab",
585+
rewardToken: address(angle),
586+
amount: amount,
587+
campaignType: 0,
588+
startTimestamp: uint32(block.timestamp + 1),
589+
duration: 3600
590+
});
591+
592+
vm.prank(governor);
593+
creator.setFees(0);
594+
595+
vm.prank(governor);
596+
creator.setFeeRecipient(dylan);
597+
598+
{
599+
vm.startPrank(alice);
600+
creator.increaseTokenBalance(alice, address(angle), 1e10);
601+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10);
602+
address distributor = creator.distributor();
603+
uint256 balance = angle.balanceOf(address(alice));
604+
uint256 creatorBalance = angle.balanceOf(address(creator));
605+
uint256 distributorBalance = angle.balanceOf(address(distributor));
606+
creator.createCampaign(campaign);
607+
assertEq(creator.creatorBalance(address(alice), address(angle)), 1e10 - amount);
608+
assertEq(angle.balanceOf(address(alice)), balance);
609+
assertEq(angle.balanceOf(address(creator)), creatorBalance - amount);
610+
assertEq(angle.balanceOf(address(dylan)), 0);
611+
assertEq(angle.balanceOf(address(distributor)), distributorBalance + amount);
612+
}
613+
614+
address[] memory whitelist = new address[](1);
615+
whitelist[0] = alice;
616+
address[] memory blacklist = new address[](1);
617+
blacklist[0] = charlie;
618+
619+
bytes memory extraData = hex"ab";
620+
621+
// Additional asserts to check for correct behavior
622+
bytes32 campaignId = bytes32(
623+
keccak256(
624+
abi.encodePacked(
625+
block.chainid,
626+
alice,
627+
address(campaign.rewardToken),
628+
uint32(campaign.campaignType),
629+
uint32(campaign.startTimestamp),
630+
uint32(campaign.duration),
631+
campaign.campaignData
632+
)
633+
)
634+
);
635+
(
636+
bytes32 fetchedCampaignId,
637+
address fetchedCreator,
638+
address fetchedRewardToken,
639+
uint256 fetchedAmount,
640+
uint32 fetchedCampaignType,
641+
uint32 fetchedStartTimestamp,
642+
uint32 fetchedDuration,
643+
bytes memory fetchedCampaignData
644+
) = creator.campaignList(creator.campaignLookup(campaignId));
645+
assertEq(alice, fetchedCreator);
646+
assertEq(amount, fetchedAmount);
647+
assertEq(address(angle), fetchedRewardToken);
648+
assertEq(campaign.campaignType, fetchedCampaignType);
649+
assertEq(campaign.startTimestamp, fetchedStartTimestamp);
650+
assertEq(campaign.duration, fetchedDuration);
651+
assertEq(extraData, fetchedCampaignData);
652+
assertEq(campaignId, fetchedCampaignId);
653+
}
431654
}
432655

433656
contract Test_DistributionCreator_CreateCampaigns is DistributionCreatorTest {
@@ -642,8 +865,8 @@ contract Test_DistributionCreator_acceptConditions is DistributionCreatorTest {
642865
}
643866

644867
contract Test_DistributionCreator_setFees is DistributionCreatorTest {
645-
function test_RevertWhen_NotGovernor() public {
646-
vm.expectRevert(Errors.NotGovernor.selector);
868+
function test_RevertWhen_NotGuardian() public {
869+
vm.expectRevert(Errors.NotGovernorOrGuardian.selector);
647870
vm.prank(alice);
648871
creator.setFees(1e8);
649872
}

0 commit comments

Comments
 (0)