@@ -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
433656contract Test_DistributionCreator_CreateCampaigns is DistributionCreatorTest {
@@ -642,8 +865,8 @@ contract Test_DistributionCreator_acceptConditions is DistributionCreatorTest {
642865}
643866
644867contract 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