@ballkidz/defifa 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RISKS.md +7 -7
- package/STYLE_GUIDE.md +130 -61
- package/foundry.toml +0 -10
- package/package.json +6 -6
- package/remappings.txt +0 -5
- package/script/Deploy.s.sol +1 -1
- package/script/helpers/DefifaDeploymentLib.sol +1 -1
- package/src/DefifaDeployer.sol +1 -1
- package/src/DefifaHook.sol +1 -0
- package/src/interfaces/IDefifaDeployer.sol +0 -1
- package/src/interfaces/IDefifaGovernor.sol +0 -1
- package/src/interfaces/IDefifaTokenUriResolver.sol +0 -2
- package/src/structs/DefifaLaunchProjectData.sol +0 -2
- package/test/DefifaFeeAccounting.t.sol +4 -4
- package/test/DefifaGovernor.t.sol +6 -12
- package/test/{DefifaHook_AuditFindings.t.sol → DefifaHookRegressions.t.sol} +5 -5
- package/test/DefifaNoContest.t.sol +1 -1
- package/test/DefifaSecurity.t.sol +1 -1
- package/test/DefifaUSDC.t.sol +470 -0
- package/test/Fork.t.sol +70 -81
- package/test/regression/{M36_FulfillmentBlocksRatification.t.sol → FulfillmentBlocksRatification.t.sol} +3 -3
- package/test/regression/{M35_GracePeriodBypass.t.sol → GracePeriodBypass.t.sol} +3 -3
package/test/Fork.t.sol
CHANGED
|
@@ -59,19 +59,8 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
59
59
|
DefifaGovernor _gov;
|
|
60
60
|
address[] _users;
|
|
61
61
|
|
|
62
|
-
modifier onlyFork() {
|
|
63
|
-
string memory rpcUrl = vm.envOr("RPC_ETHEREUM_MAINNET", string(""));
|
|
64
|
-
if (bytes(rpcUrl).length == 0) {
|
|
65
|
-
vm.skip(true);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
_;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
62
|
function setUp() public virtual override {
|
|
72
|
-
|
|
73
|
-
if (bytes(rpcUrl).length == 0) return;
|
|
74
|
-
vm.createSelectFork(rpcUrl);
|
|
63
|
+
vm.createSelectFork("ethereum");
|
|
75
64
|
|
|
76
65
|
// Deploy JB core fresh on fork.
|
|
77
66
|
super.setUp();
|
|
@@ -156,7 +145,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
156
145
|
// FULL LIFECYCLE: Mint → Refund → Score → Ratify → Cash Out
|
|
157
146
|
// =========================================================================
|
|
158
147
|
|
|
159
|
-
function test_fork_fullLifecycle_4tiers() external
|
|
148
|
+
function test_fork_fullLifecycle_4tiers() external {
|
|
160
149
|
_setupGame(4, 1 ether);
|
|
161
150
|
|
|
162
151
|
// Verify MINT phase.
|
|
@@ -208,7 +197,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
208
197
|
// REFUND PHASE: Full refund during MINT, partial refund patterns
|
|
209
198
|
// =========================================================================
|
|
210
199
|
|
|
211
|
-
function test_fork_refundDuringMint_exactPrice() external
|
|
200
|
+
function test_fork_refundDuringMint_exactPrice() external {
|
|
212
201
|
_setupGame(8, 2 ether);
|
|
213
202
|
|
|
214
203
|
// Refund first 4 users during MINT.
|
|
@@ -223,7 +212,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
223
212
|
assertEq(_balance(), 8 ether, "pot = remaining mints");
|
|
224
213
|
}
|
|
225
214
|
|
|
226
|
-
function test_fork_refundDuringRefundPhase() external
|
|
215
|
+
function test_fork_refundDuringRefundPhase() external {
|
|
227
216
|
_setupGame(4, 1 ether);
|
|
228
217
|
|
|
229
218
|
// Advance past MINT into REFUND phase.
|
|
@@ -240,7 +229,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
240
229
|
// HIGH VOLUME: 32 tiers × 100 ETH each = 3,200 ETH pot
|
|
241
230
|
// =========================================================================
|
|
242
231
|
|
|
243
|
-
function test_fork_highVolume_32tiers_100eth() external
|
|
232
|
+
function test_fork_highVolume_32tiers_100eth() external {
|
|
244
233
|
_setupGame(32, 100 ether);
|
|
245
234
|
_toScoring();
|
|
246
235
|
|
|
@@ -273,7 +262,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
273
262
|
// EXTREME ROUNDING: 1 wei weights, 1000 ETH per tier
|
|
274
263
|
// =========================================================================
|
|
275
264
|
|
|
276
|
-
function test_fork_extremeWeights_1weiAnd999999() external
|
|
265
|
+
function test_fork_extremeWeights_1weiAnd999999() external {
|
|
277
266
|
_setupGame(3, 1000 ether);
|
|
278
267
|
_toScoring();
|
|
279
268
|
|
|
@@ -293,7 +282,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
293
282
|
// MULTI-PLAYER PER TIER: 5 winners, 3 losers
|
|
294
283
|
// =========================================================================
|
|
295
284
|
|
|
296
|
-
function test_fork_multiPlayerPerTier_winnerTakeAll() external
|
|
285
|
+
function test_fork_multiPlayerPerTier_winnerTakeAll() external {
|
|
297
286
|
_setupMultiPlayer();
|
|
298
287
|
_toScoring();
|
|
299
288
|
|
|
@@ -326,7 +315,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
326
315
|
// ADVERSARIAL: Overweight scorecard (120%) rejected
|
|
327
316
|
// =========================================================================
|
|
328
317
|
|
|
329
|
-
function test_fork_rejectsOverweightScorecard() external
|
|
318
|
+
function test_fork_rejectsOverweightScorecard() external {
|
|
330
319
|
_setupGame(4, 1 ether);
|
|
331
320
|
_toScoring();
|
|
332
321
|
|
|
@@ -345,7 +334,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
345
334
|
// ADVERSARIAL: Underweight scorecard (80%) rejected
|
|
346
335
|
// =========================================================================
|
|
347
336
|
|
|
348
|
-
function test_fork_rejectsUnderweightScorecard() external
|
|
337
|
+
function test_fork_rejectsUnderweightScorecard() external {
|
|
349
338
|
_setupGame(4, 1 ether);
|
|
350
339
|
_toScoring();
|
|
351
340
|
|
|
@@ -364,7 +353,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
364
353
|
// ADVERSARIAL: Double attestation attempt
|
|
365
354
|
// =========================================================================
|
|
366
355
|
|
|
367
|
-
function test_fork_doubleAttestationReverts() external
|
|
356
|
+
function test_fork_doubleAttestationReverts() external {
|
|
368
357
|
_setupGame(4, 1 ether);
|
|
369
358
|
_toScoring();
|
|
370
359
|
|
|
@@ -386,7 +375,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
386
375
|
// ADVERSARIAL: Duplicate scorecard submission reverts
|
|
387
376
|
// =========================================================================
|
|
388
377
|
|
|
389
|
-
function test_fork_duplicateScorecardReverts() external
|
|
378
|
+
function test_fork_duplicateScorecardReverts() external {
|
|
390
379
|
_setupGame(4, 1 ether);
|
|
391
380
|
_toScoring();
|
|
392
381
|
|
|
@@ -401,7 +390,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
401
390
|
// ADVERSARIAL: Double ratification reverts
|
|
402
391
|
// =========================================================================
|
|
403
392
|
|
|
404
|
-
function test_fork_doubleRatificationReverts() external
|
|
393
|
+
function test_fork_doubleRatificationReverts() external {
|
|
405
394
|
_setupGame(4, 1 ether);
|
|
406
395
|
_toScoring();
|
|
407
396
|
|
|
@@ -416,7 +405,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
416
405
|
// ADVERSARIAL: Cash out weights set twice reverts
|
|
417
406
|
// =========================================================================
|
|
418
407
|
|
|
419
|
-
function test_fork_cashOutWeightsAlreadySetReverts() external
|
|
408
|
+
function test_fork_cashOutWeightsAlreadySetReverts() external {
|
|
420
409
|
_setupGame(4, 1 ether);
|
|
421
410
|
_toScoring();
|
|
422
411
|
|
|
@@ -436,7 +425,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
436
425
|
// ADVERSARIAL: Delegation blocked after MINT phase
|
|
437
426
|
// =========================================================================
|
|
438
427
|
|
|
439
|
-
function test_fork_delegationBlockedAfterMint() external
|
|
428
|
+
function test_fork_delegationBlockedAfterMint() external {
|
|
440
429
|
_setupGame(4, 1 ether);
|
|
441
430
|
|
|
442
431
|
// Advance to REFUND phase.
|
|
@@ -458,7 +447,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
458
447
|
// ADVERSARIAL: Cash out before scorecard — reverts (nothing to claim)
|
|
459
448
|
// =========================================================================
|
|
460
449
|
|
|
461
|
-
function test_fork_cashOutBeforeScorecard_reverts() external
|
|
450
|
+
function test_fork_cashOutBeforeScorecard_reverts() external {
|
|
462
451
|
_setupGame(4, 1 ether);
|
|
463
452
|
_toScoring();
|
|
464
453
|
|
|
@@ -484,7 +473,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
484
473
|
// ADVERSARIAL: Non-holder tries to cash out someone else's NFT
|
|
485
474
|
// =========================================================================
|
|
486
475
|
|
|
487
|
-
function test_fork_nonHolderCashOutReverts() external
|
|
476
|
+
function test_fork_nonHolderCashOutReverts() external {
|
|
488
477
|
_setupGame(4, 1 ether);
|
|
489
478
|
_toScoring();
|
|
490
479
|
|
|
@@ -513,7 +502,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
513
502
|
// ADVERSARIAL: Scorecard with weight on unminted tier reverts
|
|
514
503
|
// =========================================================================
|
|
515
504
|
|
|
516
|
-
function test_fork_weightOnUnmintedTierReverts() external
|
|
505
|
+
function test_fork_weightOnUnmintedTierReverts() external {
|
|
517
506
|
// Launch 8-tier game but only mint 4 tiers.
|
|
518
507
|
_setupPartial(8, 4, 1 ether);
|
|
519
508
|
_toScoring();
|
|
@@ -535,7 +524,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
535
524
|
// ADVERSARIAL: Scorecard submission outside SCORING phase
|
|
536
525
|
// =========================================================================
|
|
537
526
|
|
|
538
|
-
function test_fork_scorecardSubmitOutsideScoring_reverts() external
|
|
527
|
+
function test_fork_scorecardSubmitOutsideScoring_reverts() external {
|
|
539
528
|
_setupGame(4, 1 ether);
|
|
540
529
|
|
|
541
530
|
// Still in MINT phase.
|
|
@@ -551,7 +540,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
551
540
|
// ADVERSARIAL: Attestation outside SCORING phase (during COMPLETE)
|
|
552
541
|
// =========================================================================
|
|
553
542
|
|
|
554
|
-
function test_fork_attestationAfterRatification_reverts() external
|
|
543
|
+
function test_fork_attestationAfterRatification_reverts() external {
|
|
555
544
|
_setupGame(4, 1 ether);
|
|
556
545
|
_toScoring();
|
|
557
546
|
|
|
@@ -574,7 +563,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
574
563
|
// ADVERSARIAL: NFT transfer then try to double-vote
|
|
575
564
|
// =========================================================================
|
|
576
565
|
|
|
577
|
-
function test_fork_nftTransferDoesNotDoubleVote() external
|
|
566
|
+
function test_fork_nftTransferDoesNotDoubleVote() external {
|
|
578
567
|
_setupGame(4, 1 ether);
|
|
579
568
|
|
|
580
569
|
// user[0] transfers their NFT to user[1] (who already has tier 2)
|
|
@@ -620,7 +609,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
620
609
|
// ADVERSARIAL: Competing scorecards — only one can be ratified
|
|
621
610
|
// =========================================================================
|
|
622
611
|
|
|
623
|
-
function test_fork_competingScorecards_onlyOneRatified() external
|
|
612
|
+
function test_fork_competingScorecards_onlyOneRatified() external {
|
|
624
613
|
_setupGame(4, 1 ether);
|
|
625
614
|
_toScoring();
|
|
626
615
|
|
|
@@ -647,7 +636,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
647
636
|
// ADVERSARIAL: fulfillCommitmentsOf double-call (idempotent)
|
|
648
637
|
// =========================================================================
|
|
649
638
|
|
|
650
|
-
function test_fork_doubleFulfillment_idempotent() external
|
|
639
|
+
function test_fork_doubleFulfillment_idempotent() external {
|
|
651
640
|
_setupGame(4, 1 ether);
|
|
652
641
|
_toScoring();
|
|
653
642
|
|
|
@@ -666,7 +655,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
666
655
|
// ADVERSARIAL: fulfillCommitmentsOf before ratification reverts
|
|
667
656
|
// =========================================================================
|
|
668
657
|
|
|
669
|
-
function test_fork_fulfillBeforeRatification_reverts() external
|
|
658
|
+
function test_fork_fulfillBeforeRatification_reverts() external {
|
|
670
659
|
_setupGame(4, 1 ether);
|
|
671
660
|
_toScoring();
|
|
672
661
|
|
|
@@ -678,7 +667,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
678
667
|
// GOVERNANCE: Quorum calculation with partial minting
|
|
679
668
|
// =========================================================================
|
|
680
669
|
|
|
681
|
-
function test_fork_quorum_partialMinting() external
|
|
670
|
+
function test_fork_quorum_partialMinting() external {
|
|
682
671
|
_setupPartial(10, 6, 1 ether);
|
|
683
672
|
uint256 expected = (6 * _gov.MAX_ATTESTATION_POWER_TIER()) / 2;
|
|
684
673
|
assertEq(_gov.quorum(_gameId), expected, "quorum = 50% of minted tiers");
|
|
@@ -688,7 +677,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
688
677
|
// GOVERNANCE: Single-tier game (minimum viable game)
|
|
689
678
|
// =========================================================================
|
|
690
679
|
|
|
691
|
-
function test_fork_singleTierGame() external
|
|
680
|
+
function test_fork_singleTierGame() external {
|
|
692
681
|
DefifaLaunchProjectData memory d = _launchData(1, 1 ether);
|
|
693
682
|
(_pid, _nft, _gov) = _launch(d);
|
|
694
683
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -717,7 +706,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
717
706
|
// NO CONTEST: minParticipation threshold triggers NO_CONTEST
|
|
718
707
|
// =========================================================================
|
|
719
708
|
|
|
720
|
-
function test_fork_noContest_minParticipation() external
|
|
709
|
+
function test_fork_noContest_minParticipation() external {
|
|
721
710
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 5 ether, 0);
|
|
722
711
|
(_pid, _nft, _gov) = _launch(d);
|
|
723
712
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -736,7 +725,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
736
725
|
// NO CONTEST: scorecardTimeout triggers NO_CONTEST
|
|
737
726
|
// =========================================================================
|
|
738
727
|
|
|
739
|
-
function test_fork_noContest_scorecardTimeout() external
|
|
728
|
+
function test_fork_noContest_scorecardTimeout() external {
|
|
740
729
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 0, 7 days);
|
|
741
730
|
(_pid, _nft, _gov) = _launch(d);
|
|
742
731
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -761,7 +750,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
761
750
|
// NO CONTEST: triggerNoContestFor + full refund
|
|
762
751
|
// =========================================================================
|
|
763
752
|
|
|
764
|
-
function test_fork_noContest_triggerAndRefund() external
|
|
753
|
+
function test_fork_noContest_triggerAndRefund() external {
|
|
765
754
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 2 ether, 0, 7 days);
|
|
766
755
|
(_pid, _nft, _gov) = _launch(d);
|
|
767
756
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -792,7 +781,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
792
781
|
// NO CONTEST: Double trigger reverts
|
|
793
782
|
// =========================================================================
|
|
794
783
|
|
|
795
|
-
function test_fork_noContest_doubleTriggerReverts() external
|
|
784
|
+
function test_fork_noContest_doubleTriggerReverts() external {
|
|
796
785
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 0, 7 days);
|
|
797
786
|
(_pid, _nft, _gov) = _launch(d);
|
|
798
787
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -813,7 +802,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
813
802
|
// NO CONTEST: triggerNoContest outside NO_CONTEST phase reverts
|
|
814
803
|
// =========================================================================
|
|
815
804
|
|
|
816
|
-
function test_fork_noContest_triggerWhenScoring_reverts() external
|
|
805
|
+
function test_fork_noContest_triggerWhenScoring_reverts() external {
|
|
817
806
|
_setupGame(4, 1 ether);
|
|
818
807
|
_toScoring();
|
|
819
808
|
|
|
@@ -825,7 +814,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
825
814
|
// NO CONTEST: Ratified scorecard prevents NO_CONTEST forever
|
|
826
815
|
// =========================================================================
|
|
827
816
|
|
|
828
|
-
function test_fork_ratifiedPreventsNoContest() external
|
|
817
|
+
function test_fork_ratifiedPreventsNoContest() external {
|
|
829
818
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 0, 7 days);
|
|
830
819
|
(_pid, _nft, _gov) = _launch(d);
|
|
831
820
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -853,7 +842,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
853
842
|
// FEE ACCOUNTING: Default splits (no user splits)
|
|
854
843
|
// =========================================================================
|
|
855
844
|
|
|
856
|
-
function test_fork_feeAccounting_defaultSplits() external
|
|
845
|
+
function test_fork_feeAccounting_defaultSplits() external {
|
|
857
846
|
_setupGame(4, 1 ether);
|
|
858
847
|
|
|
859
848
|
uint256 potBefore = _balance();
|
|
@@ -875,7 +864,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
875
864
|
// FEE ACCOUNTING: fee + surplus = original pot (zero rounding loss)
|
|
876
865
|
// =========================================================================
|
|
877
866
|
|
|
878
|
-
function test_fork_feeAccounting_noRoundingLoss() external
|
|
867
|
+
function test_fork_feeAccounting_noRoundingLoss() external {
|
|
879
868
|
_setupGame(4, 1 ether);
|
|
880
869
|
|
|
881
870
|
uint256 potBefore = _balance();
|
|
@@ -892,7 +881,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
892
881
|
// FEE ACCOUNTING: With user-provided custom splits
|
|
893
882
|
// =========================================================================
|
|
894
883
|
|
|
895
|
-
function test_fork_feeAccounting_withUserSplits() external
|
|
884
|
+
function test_fork_feeAccounting_withUserSplits() external {
|
|
896
885
|
JBSplit[] memory customSplits = new JBSplit[](1);
|
|
897
886
|
address charity = address(bytes20(keccak256("charity")));
|
|
898
887
|
customSplits[0] = JBSplit({
|
|
@@ -932,7 +921,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
932
921
|
// FEE TOKENS: Reserved minters get proportional $DEFIFA/$NANA
|
|
933
922
|
// =========================================================================
|
|
934
923
|
|
|
935
|
-
function test_fork_reservedMintersGetFeeTokens() external
|
|
924
|
+
function test_fork_reservedMintersGetFeeTokens() external {
|
|
936
925
|
address reserveAddr = address(bytes20(keccak256("reserveBeneficiary")));
|
|
937
926
|
|
|
938
927
|
DefifaTierParams[] memory tp = new DefifaTierParams[](2);
|
|
@@ -1059,7 +1048,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1059
1048
|
// CASH OUT ORDERING: First vs last to exit — fair distribution
|
|
1060
1049
|
// =========================================================================
|
|
1061
1050
|
|
|
1062
|
-
function test_fork_cashOutOrdering_fairAcrossExitOrder() external
|
|
1051
|
+
function test_fork_cashOutOrdering_fairAcrossExitOrder() external {
|
|
1063
1052
|
_setupGame(4, 10 ether);
|
|
1064
1053
|
_toScoring();
|
|
1065
1054
|
|
|
@@ -1083,7 +1072,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1083
1072
|
// GAME POT REPORTING: currentGamePotOf accuracy
|
|
1084
1073
|
// =========================================================================
|
|
1085
1074
|
|
|
1086
|
-
function test_fork_gamePotReporting() external
|
|
1075
|
+
function test_fork_gamePotReporting() external {
|
|
1087
1076
|
_setupGame(4, 1 ether);
|
|
1088
1077
|
_toScoring();
|
|
1089
1078
|
|
|
@@ -1105,7 +1094,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1105
1094
|
// PHASE TRANSITIONS: Correct sequence
|
|
1106
1095
|
// =========================================================================
|
|
1107
1096
|
|
|
1108
|
-
function test_fork_phaseTransitions_correctSequence() external
|
|
1097
|
+
function test_fork_phaseTransitions_correctSequence() external {
|
|
1109
1098
|
DefifaLaunchProjectData memory d = _launchData(4, 1 ether);
|
|
1110
1099
|
(_pid, _nft, _gov) = _launch(d);
|
|
1111
1100
|
|
|
@@ -1129,7 +1118,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1129
1118
|
// GAME TIMES: timesFor view returns correct values
|
|
1130
1119
|
// =========================================================================
|
|
1131
1120
|
|
|
1132
|
-
function test_fork_timesFor() external
|
|
1121
|
+
function test_fork_timesFor() external {
|
|
1133
1122
|
DefifaLaunchProjectData memory d = _launchData(4, 1 ether);
|
|
1134
1123
|
(_pid, _nft, _gov) = _launch(d);
|
|
1135
1124
|
|
|
@@ -1143,7 +1132,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1143
1132
|
// EDGE: NFT transfer → new owner cashes out, firstOwnerOf preserved
|
|
1144
1133
|
// =========================================================================
|
|
1145
1134
|
|
|
1146
|
-
function test_fork_nftTransfer_newOwnerCashesOut() external
|
|
1135
|
+
function test_fork_nftTransfer_newOwnerCashesOut() external {
|
|
1147
1136
|
_setupGame(4, 1 ether);
|
|
1148
1137
|
_toScoring();
|
|
1149
1138
|
|
|
@@ -1188,7 +1177,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1188
1177
|
// EDGE: Intra-tier fairness — 5 holders same tier, sequential cash outs
|
|
1189
1178
|
// =========================================================================
|
|
1190
1179
|
|
|
1191
|
-
function test_fork_intraTierFairness_5holders() external
|
|
1180
|
+
function test_fork_intraTierFairness_5holders() external {
|
|
1192
1181
|
DefifaLaunchProjectData memory d = _launchData(2, 1 ether);
|
|
1193
1182
|
(_pid, _nft, _gov) = _launch(d);
|
|
1194
1183
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -1232,7 +1221,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1232
1221
|
// EDGE: Multi-token cash out — burn 3 NFTs from same tier in one tx
|
|
1233
1222
|
// =========================================================================
|
|
1234
1223
|
|
|
1235
|
-
function test_fork_multiTokenCashOut_sameTier() external
|
|
1224
|
+
function test_fork_multiTokenCashOut_sameTier() external {
|
|
1236
1225
|
DefifaLaunchProjectData memory d = _launchData(2, 1 ether);
|
|
1237
1226
|
(_pid, _nft, _gov) = _launch(d);
|
|
1238
1227
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -1298,7 +1287,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1298
1287
|
// EDGE: Cross-tier cash out — burn tokens from different tiers in one tx
|
|
1299
1288
|
// =========================================================================
|
|
1300
1289
|
|
|
1301
|
-
function test_fork_crossTierCashOut_singleTx() external
|
|
1290
|
+
function test_fork_crossTierCashOut_singleTx() external {
|
|
1302
1291
|
_setupGame(4, 1 ether);
|
|
1303
1292
|
_toScoring();
|
|
1304
1293
|
|
|
@@ -1337,7 +1326,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1337
1326
|
// EDGE: Zero-power attestation — non-holder attests with 0 weight
|
|
1338
1327
|
// =========================================================================
|
|
1339
1328
|
|
|
1340
|
-
function test_fork_zeroPowerAttestation() external
|
|
1329
|
+
function test_fork_zeroPowerAttestation() external {
|
|
1341
1330
|
_setupGame(4, 1 ether);
|
|
1342
1331
|
_toScoring();
|
|
1343
1332
|
|
|
@@ -1365,7 +1354,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1365
1354
|
// EDGE: Delegation to address(0) via setTierDelegateTo (no validation)
|
|
1366
1355
|
// =========================================================================
|
|
1367
1356
|
|
|
1368
|
-
function test_fork_delegateToZero_viaSetTierDelegateTo() external
|
|
1357
|
+
function test_fork_delegateToZero_viaSetTierDelegateTo() external {
|
|
1369
1358
|
_setupGame(4, 1 ether);
|
|
1370
1359
|
|
|
1371
1360
|
// setTierDelegateTo allows address(0) — no check (unlike setTierDelegatesTo which reverts).
|
|
@@ -1401,7 +1390,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1401
1390
|
// EDGE: minParticipation boundary — balance == minParticipation → NO_CONTEST
|
|
1402
1391
|
// =========================================================================
|
|
1403
1392
|
|
|
1404
|
-
function test_fork_minParticipation_exactBoundary_meets() external
|
|
1393
|
+
function test_fork_minParticipation_exactBoundary_meets() external {
|
|
1405
1394
|
// balance == minParticipation: check uses `<`, so 4 < 4 = false → SCORING.
|
|
1406
1395
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 4 ether, 0);
|
|
1407
1396
|
(_pid, _nft, _gov) = _launch(d);
|
|
@@ -1419,7 +1408,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1419
1408
|
assertEq(uint256(deployer.currentGamePhaseOf(_pid)), uint256(DefifaGamePhase.SCORING));
|
|
1420
1409
|
}
|
|
1421
1410
|
|
|
1422
|
-
function test_fork_minParticipation_belowThreshold() external
|
|
1411
|
+
function test_fork_minParticipation_belowThreshold() external {
|
|
1423
1412
|
// balance < minParticipation → NO_CONTEST.
|
|
1424
1413
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 4 ether + 1, 0);
|
|
1425
1414
|
(_pid, _nft, _gov) = _launch(d);
|
|
@@ -1441,7 +1430,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1441
1430
|
// EDGE: Cash out during SCORING (before weights set) → NothingToClaim
|
|
1442
1431
|
// =========================================================================
|
|
1443
1432
|
|
|
1444
|
-
function test_fork_cashOutDuringScoring_reverts() external
|
|
1433
|
+
function test_fork_cashOutDuringScoring_reverts() external {
|
|
1445
1434
|
_setupGame(4, 1 ether);
|
|
1446
1435
|
_toScoring();
|
|
1447
1436
|
|
|
@@ -1465,7 +1454,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1465
1454
|
// EDGE: NFT transfer destroys delegation — new owner can't vote in SCORING
|
|
1466
1455
|
// =========================================================================
|
|
1467
1456
|
|
|
1468
|
-
function test_fork_nftTransfer_recipientGetsAttestationPower() external
|
|
1457
|
+
function test_fork_nftTransfer_recipientGetsAttestationPower() external {
|
|
1469
1458
|
_setupGame(4, 1 ether);
|
|
1470
1459
|
|
|
1471
1460
|
address recipient = _addr(999);
|
|
@@ -1503,7 +1492,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1503
1492
|
// EDGE: Delegation change reverts outside MINT phase
|
|
1504
1493
|
// =========================================================================
|
|
1505
1494
|
|
|
1506
|
-
function test_fork_delegateDuringScoring_reverts() external
|
|
1495
|
+
function test_fork_delegateDuringScoring_reverts() external {
|
|
1507
1496
|
_setupGame(4, 1 ether);
|
|
1508
1497
|
_toScoring();
|
|
1509
1498
|
|
|
@@ -1518,7 +1507,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1518
1507
|
// EDGE: Scorecard timeout boundary — exact tick
|
|
1519
1508
|
// =========================================================================
|
|
1520
1509
|
|
|
1521
|
-
function test_fork_scorecardTimeout_exactBoundary() external
|
|
1510
|
+
function test_fork_scorecardTimeout_exactBoundary() external {
|
|
1522
1511
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 0, 7 days);
|
|
1523
1512
|
(_pid, _nft, _gov) = _launch(d);
|
|
1524
1513
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -1554,7 +1543,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1554
1543
|
// EDGE: Refund then re-mint same tier (user comes back)
|
|
1555
1544
|
// =========================================================================
|
|
1556
1545
|
|
|
1557
|
-
function test_fork_refundThenRemint() external
|
|
1546
|
+
function test_fork_refundThenRemint() external {
|
|
1558
1547
|
_setupGame(4, 1 ether);
|
|
1559
1548
|
|
|
1560
1549
|
address user = _users[0];
|
|
@@ -1577,7 +1566,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1577
1566
|
// EDGE: Defeated scorecard after another is ratified
|
|
1578
1567
|
// =========================================================================
|
|
1579
1568
|
|
|
1580
|
-
function test_fork_defeatedScorecard_afterRatification() external
|
|
1569
|
+
function test_fork_defeatedScorecard_afterRatification() external {
|
|
1581
1570
|
_setupGame(4, 1 ether);
|
|
1582
1571
|
_toScoring();
|
|
1583
1572
|
|
|
@@ -1602,7 +1591,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1602
1591
|
// EDGE: Reserve mint → attestation power
|
|
1603
1592
|
// =========================================================================
|
|
1604
1593
|
|
|
1605
|
-
function test_fork_reserveMint_getsAttestationPower() external
|
|
1594
|
+
function test_fork_reserveMint_getsAttestationPower() external {
|
|
1606
1595
|
_setupGame(4, 1 ether);
|
|
1607
1596
|
|
|
1608
1597
|
// The reserve beneficiary is address(0) in our default params (no reserved token beneficiary).
|
|
@@ -1635,7 +1624,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1635
1624
|
// EDGE: Quorum with odd number of minted tiers (rounding)
|
|
1636
1625
|
// =========================================================================
|
|
1637
1626
|
|
|
1638
|
-
function test_fork_quorum_oddTierCount() external
|
|
1627
|
+
function test_fork_quorum_oddTierCount() external {
|
|
1639
1628
|
// 3 tiers minted. Quorum = (3 * MAX_ATTESTATION_POWER_TIER) / 2 = 1.5e9 → rounds to 1_500_000_000.
|
|
1640
1629
|
_setupGame(3, 1 ether);
|
|
1641
1630
|
_toScoring();
|
|
@@ -1667,7 +1656,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1667
1656
|
// EDGE: Quorum NOT met with 1 of 5 tiers (below 50%)
|
|
1668
1657
|
// =========================================================================
|
|
1669
1658
|
|
|
1670
|
-
function test_fork_quorum_notMet_1of5() external
|
|
1659
|
+
function test_fork_quorum_notMet_1of5() external {
|
|
1671
1660
|
// Use 5 tiers so quorum = 5 * MAX / 2 = 2.5e9.
|
|
1672
1661
|
// A sole holder contributes ~2e9 (due to 2x attestation factor) < 2.5e9 → quorum NOT met.
|
|
1673
1662
|
_setupGame(5, 1 ether);
|
|
@@ -1701,7 +1690,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1701
1690
|
// EDGE: NO_CONTEST full cycle — trigger, then all users refund at mint price
|
|
1702
1691
|
// =========================================================================
|
|
1703
1692
|
|
|
1704
|
-
function test_fork_noContest_fullRefundCycle() external
|
|
1693
|
+
function test_fork_noContest_fullRefundCycle() external {
|
|
1705
1694
|
DefifaLaunchProjectData memory d = _launchDataWith(4, 1 ether, 0, 7 days);
|
|
1706
1695
|
(_pid, _nft, _gov) = _launch(d);
|
|
1707
1696
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -1739,7 +1728,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1739
1728
|
// EDGE: Attestation weight shared proportionally within tier
|
|
1740
1729
|
// =========================================================================
|
|
1741
1730
|
|
|
1742
|
-
function test_fork_attestationWeight_proportionalInTier() external
|
|
1731
|
+
function test_fork_attestationWeight_proportionalInTier() external {
|
|
1743
1732
|
DefifaLaunchProjectData memory d = _launchData(2, 1 ether);
|
|
1744
1733
|
(_pid, _nft, _gov) = _launch(d);
|
|
1745
1734
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -1797,7 +1786,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1797
1786
|
// EDGE: Cash out non-owned token ID → Unauthorized
|
|
1798
1787
|
// =========================================================================
|
|
1799
1788
|
|
|
1800
|
-
function test_fork_cashOut_wrongTokenId_reverts() external
|
|
1789
|
+
function test_fork_cashOut_wrongTokenId_reverts() external {
|
|
1801
1790
|
_setupGame(4, 1 ether);
|
|
1802
1791
|
_toScoring();
|
|
1803
1792
|
_attestAndRatify(_evenScorecard(4));
|
|
@@ -1833,7 +1822,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1833
1822
|
// EDGE: Submit scorecard outside SCORING phase
|
|
1834
1823
|
// =========================================================================
|
|
1835
1824
|
|
|
1836
|
-
function test_fork_submitScorecard_duringMint_reverts() external
|
|
1825
|
+
function test_fork_submitScorecard_duringMint_reverts() external {
|
|
1837
1826
|
_setupGame(4, 1 ether);
|
|
1838
1827
|
// Still in MINT phase.
|
|
1839
1828
|
|
|
@@ -1846,7 +1835,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1846
1835
|
// EDGE: Two-player precise accounting — winner takes (surplus - dust)
|
|
1847
1836
|
// =========================================================================
|
|
1848
1837
|
|
|
1849
|
-
function test_fork_twoplayer_preciseAccounting() external
|
|
1838
|
+
function test_fork_twoplayer_preciseAccounting() external {
|
|
1850
1839
|
_setupGame(2, 5 ether);
|
|
1851
1840
|
|
|
1852
1841
|
uint256 totalPot = _balance();
|
|
@@ -1877,7 +1866,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1877
1866
|
// FUZZ: Fund conservation across varying tier/player counts
|
|
1878
1867
|
// =========================================================================
|
|
1879
1868
|
|
|
1880
|
-
function test_fork_fuzz_fundConservation(uint8 rawTiers, uint8 rawPlayers) external
|
|
1869
|
+
function test_fork_fuzz_fundConservation(uint8 rawTiers, uint8 rawPlayers) external {
|
|
1881
1870
|
uint8 nTiers = uint8(bound(rawTiers, 2, 12));
|
|
1882
1871
|
uint8 nPPT = uint8(bound(rawPlayers, 1, 3));
|
|
1883
1872
|
|
|
@@ -1915,7 +1904,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1915
1904
|
// SCORECARD STATE MACHINE: PENDING → ACTIVE → SUCCEEDED → RATIFIED
|
|
1916
1905
|
// =========================================================================
|
|
1917
1906
|
|
|
1918
|
-
function test_fork_scorecardStateMachine() external
|
|
1907
|
+
function test_fork_scorecardStateMachine() external {
|
|
1919
1908
|
_setupGame(4, 1 ether);
|
|
1920
1909
|
_toScoring();
|
|
1921
1910
|
|
|
@@ -1951,7 +1940,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1951
1940
|
// SCORECARD: Ratification before SUCCEEDED state reverts
|
|
1952
1941
|
// =========================================================================
|
|
1953
1942
|
|
|
1954
|
-
function test_fork_ratifyBeforeSucceeded_reverts() external
|
|
1943
|
+
function test_fork_ratifyBeforeSucceeded_reverts() external {
|
|
1955
1944
|
_setupGame(4, 1 ether);
|
|
1956
1945
|
_toScoring();
|
|
1957
1946
|
|
|
@@ -1967,7 +1956,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1967
1956
|
// SCORECARD: Unknown scorecard reverts
|
|
1968
1957
|
// =========================================================================
|
|
1969
1958
|
|
|
1970
|
-
function test_fork_unknownScorecardState_reverts() external
|
|
1959
|
+
function test_fork_unknownScorecardState_reverts() external {
|
|
1971
1960
|
_setupGame(4, 1 ether);
|
|
1972
1961
|
_toScoring();
|
|
1973
1962
|
|
|
@@ -1980,7 +1969,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
1980
1969
|
// ADVERSARIAL: Zero-weight scorecard (all zeros except minimum)
|
|
1981
1970
|
// =========================================================================
|
|
1982
1971
|
|
|
1983
|
-
function test_fork_zeroWeightTiers_winnerTakeAll() external
|
|
1972
|
+
function test_fork_zeroWeightTiers_winnerTakeAll() external {
|
|
1984
1973
|
_setupGame(4, 1 ether);
|
|
1985
1974
|
_toScoring();
|
|
1986
1975
|
|
|
@@ -2009,7 +1998,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
2009
1998
|
// ADVERSARIAL: Scorecard tier order violation reverts
|
|
2010
1999
|
// =========================================================================
|
|
2011
2000
|
|
|
2012
|
-
function test_fork_scorecardBadTierOrder_reverts() external
|
|
2001
|
+
function test_fork_scorecardBadTierOrder_reverts() external {
|
|
2013
2002
|
_setupGame(4, 1 ether);
|
|
2014
2003
|
_toScoring();
|
|
2015
2004
|
|
|
@@ -2030,7 +2019,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
2030
2019
|
// MINTING: Multi-tier mint in single transaction
|
|
2031
2020
|
// =========================================================================
|
|
2032
2021
|
|
|
2033
|
-
function test_fork_multiTierMint_singleTx() external
|
|
2022
|
+
function test_fork_multiTierMint_singleTx() external {
|
|
2034
2023
|
DefifaLaunchProjectData memory d = _launchData(4, 1 ether);
|
|
2035
2024
|
(_pid, _nft, _gov) = _launch(d);
|
|
2036
2025
|
vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
|
|
@@ -2060,7 +2049,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
2060
2049
|
// GRACE PERIOD: Enforced minimum of 1 day
|
|
2061
2050
|
// =========================================================================
|
|
2062
2051
|
|
|
2063
|
-
function test_fork_gracePeriod_minimumEnforced() external
|
|
2052
|
+
function test_fork_gracePeriod_minimumEnforced() external {
|
|
2064
2053
|
DefifaLaunchProjectData memory d = DefifaLaunchProjectData({
|
|
2065
2054
|
name: "DEFIFA",
|
|
2066
2055
|
projectUri: "",
|
|
@@ -2092,7 +2081,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
2092
2081
|
// CASH OUT WEIGHT: totalCashOutWeight() is constant
|
|
2093
2082
|
// =========================================================================
|
|
2094
2083
|
|
|
2095
|
-
function test_fork_totalCashOutWeight_constant() external
|
|
2084
|
+
function test_fork_totalCashOutWeight_constant() external {
|
|
2096
2085
|
_setupGame(4, 1 ether);
|
|
2097
2086
|
|
|
2098
2087
|
// Before scorecard.
|
|
@@ -39,11 +39,11 @@ contract TimestampReader3 {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
/// @title
|
|
42
|
+
/// @title FulfillmentBlocksRatification
|
|
43
43
|
/// @notice Regression test: ratification should succeed even when fulfillCommitmentsOf reverts.
|
|
44
44
|
/// @dev Tests the try-catch wrapper around fulfillCommitmentsOf in ratifyScorecardFrom.
|
|
45
45
|
/// The test verifies that the FulfillmentFailed event is emitted and ratification completes.
|
|
46
|
-
contract
|
|
46
|
+
contract FulfillmentBlocksRatification is JBTest, TestBaseWorkflow {
|
|
47
47
|
using JBRulesetMetadataResolver for JBRuleset;
|
|
48
48
|
|
|
49
49
|
TimestampReader3 private _tsReader = new TimestampReader3();
|
|
@@ -262,7 +262,7 @@ contract M36_FulfillmentBlocksRatification is JBTest, TestBaseWorkflow {
|
|
|
262
262
|
nft = DefifaHook(_fc.dataHook());
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
-
function _buildPayMetadata(bytes memory metadata) internal returns (bytes memory) {
|
|
265
|
+
function _buildPayMetadata(bytes memory metadata) internal view returns (bytes memory) {
|
|
266
266
|
bytes[] memory data = new bytes[](1);
|
|
267
267
|
data[0] = metadata;
|
|
268
268
|
bytes4[] memory ids = new bytes4[](1);
|
|
@@ -37,11 +37,11 @@ contract TimestampReader2 {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
/// @title
|
|
40
|
+
/// @title GracePeriodBypass
|
|
41
41
|
/// @notice Regression test: grace period should extend from attestation start, not submission time.
|
|
42
42
|
/// When a scorecard is submitted early (before attestationStartTime), the grace period
|
|
43
43
|
/// must not expire before attestations begin.
|
|
44
|
-
contract
|
|
44
|
+
contract GracePeriodBypass is JBTest, TestBaseWorkflow {
|
|
45
45
|
using JBRulesetMetadataResolver for JBRuleset;
|
|
46
46
|
|
|
47
47
|
TimestampReader2 private _tsReader = new TimestampReader2();
|
|
@@ -286,7 +286,7 @@ contract M35_GracePeriodBypass is JBTest, TestBaseWorkflow {
|
|
|
286
286
|
nft = DefifaHook(_fc.dataHook());
|
|
287
287
|
}
|
|
288
288
|
|
|
289
|
-
function _buildPayMetadata(bytes memory metadata) internal returns (bytes memory) {
|
|
289
|
+
function _buildPayMetadata(bytes memory metadata) internal view returns (bytes memory) {
|
|
290
290
|
bytes[] memory data = new bytes[](1);
|
|
291
291
|
data[0] = metadata;
|
|
292
292
|
bytes4[] memory ids = new bytes4[](1);
|