@ballkidz/defifa 0.0.5 → 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/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
- string memory rpcUrl = vm.envOr("RPC_ETHEREUM_MAINNET", string(""));
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 onlyFork {
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 M36_FulfillmentBlocksRatification
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 M36_FulfillmentBlocksRatification is JBTest, TestBaseWorkflow {
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 M35_GracePeriodBypass
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 M35_GracePeriodBypass is JBTest, TestBaseWorkflow {
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);