@ballkidz/defifa 0.0.7 → 0.0.9

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.
Files changed (48) hide show
  1. package/ADMINISTRATION.md +3 -3
  2. package/ARCHITECTURE.md +2 -0
  3. package/AUDIT_INSTRUCTIONS.md +422 -0
  4. package/CRYPTO_ECON.md +5 -5
  5. package/README.md +1 -1
  6. package/RISKS.md +38 -335
  7. package/SKILLS.md +1 -1
  8. package/USER_JOURNEYS.md +691 -0
  9. package/package.json +7 -7
  10. package/script/Deploy.s.sol +14 -3
  11. package/script/helpers/DefifaDeploymentLib.sol +13 -15
  12. package/src/DefifaDeployer.sol +221 -192
  13. package/src/DefifaGovernor.sol +286 -276
  14. package/src/DefifaHook.sol +68 -34
  15. package/src/DefifaProjectOwner.sol +27 -4
  16. package/src/DefifaTokenUriResolver.sol +136 -134
  17. package/src/enums/DefifaGamePhase.sol +1 -1
  18. package/src/enums/DefifaScorecardState.sol +1 -1
  19. package/src/interfaces/IDefifaDeployer.sol +52 -50
  20. package/src/interfaces/IDefifaGamePhaseReporter.sol +2 -2
  21. package/src/interfaces/IDefifaGamePotReporter.sol +1 -1
  22. package/src/interfaces/IDefifaGovernor.sol +53 -54
  23. package/src/interfaces/IDefifaHook.sol +104 -103
  24. package/src/interfaces/IDefifaTokenUriResolver.sol +2 -2
  25. package/src/libraries/DefifaFontImporter.sol +11 -9
  26. package/src/libraries/DefifaHookLib.sol +66 -53
  27. package/src/structs/DefifaAttestations.sol +1 -1
  28. package/src/structs/DefifaDelegation.sol +1 -1
  29. package/src/structs/DefifaLaunchProjectData.sol +4 -4
  30. package/src/structs/DefifaOpsData.sol +1 -1
  31. package/src/structs/DefifaScorecard.sol +1 -1
  32. package/src/structs/DefifaTierCashOutWeight.sol +1 -1
  33. package/src/structs/DefifaTierParams.sol +2 -1
  34. package/test/DefifaAdversarialQuorum.t.sol +602 -0
  35. package/test/DefifaAuditLowGuards.t.sol +304 -0
  36. package/test/DefifaFeeAccounting.t.sol +37 -16
  37. package/test/DefifaGovernor.t.sol +43 -19
  38. package/test/DefifaHookRegressions.t.sol +14 -12
  39. package/test/DefifaMintCostInvariant.t.sol +31 -12
  40. package/test/DefifaNoContest.t.sol +34 -16
  41. package/test/DefifaSecurity.t.sol +46 -28
  42. package/test/DefifaUSDC.t.sol +45 -36
  43. package/test/Fork.t.sol +43 -43
  44. package/test/SVG.t.sol +2 -2
  45. package/test/TestAuditGaps.sol +982 -0
  46. package/test/TestQALastMile.t.sol +511 -0
  47. package/test/regression/FulfillmentBlocksRatification.t.sol +36 -30
  48. package/test/regression/GracePeriodBypass.t.sol +15 -10
@@ -1,8 +1,7 @@
1
1
  // SPDX-License-Identifier: UNLICENSED
2
2
  pragma solidity 0.8.26;
3
3
 
4
- import "forge-std/Test.sol";
5
- import "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
4
+ import {TestBaseWorkflow} from "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
6
5
 
7
6
  import {DefifaGovernor} from "../src/DefifaGovernor.sol";
8
7
  import {DefifaDeployer} from "../src/DefifaDeployer.sol";
@@ -10,24 +9,26 @@ import {DefifaHook} from "../src/DefifaHook.sol";
10
9
  import {DefifaTokenUriResolver} from "../src/DefifaTokenUriResolver.sol";
11
10
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
12
11
 
13
- import {JBMetadataResolver} from "@bananapus/core-v6/src/libraries/JBMetadataResolver.sol";
14
- import {MetadataResolverHelper} from "@bananapus/core-v6/test/helpers/MetadataResolverHelper.sol";
15
12
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
16
13
  import {JBRulesetMetadataResolver} from "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
17
- import {
18
- JB721TiersRulesetMetadataResolver
19
- } from "@bananapus/721-hook-v6/src/libraries/JB721TiersRulesetMetadataResolver.sol";
14
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
20
15
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
21
16
 
22
17
  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
23
18
  import {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
24
19
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
25
- import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
26
- import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
27
20
  import {DefifaDelegation} from "../src/structs/DefifaDelegation.sol";
28
21
  import {DefifaLaunchProjectData} from "../src/structs/DefifaLaunchProjectData.sol";
29
22
  import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
30
- import {DefifaTierCashOutWeight} from "../src/structs/DefifaTierCashOutWeight.sol";
23
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
24
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
25
+ import {JBCurrencyIds} from "@bananapus/core-v6/src/libraries/JBCurrencyIds.sol";
26
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
27
+ import {JBRulesetConfig, JBTerminalConfig} from "@bananapus/core-v6/src/interfaces/IJBController.sol";
28
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
29
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
30
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
31
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesets.sol";
31
32
 
32
33
  /// @dev Helper to read block.timestamp via an external call, bypassing the via-ir optimizer's timestamp caching.
33
34
  contract TimestampReaderRegressions {
@@ -113,10 +114,10 @@ contract DefifaHookRegressions is JBTest, TestBaseWorkflow {
113
114
  );
114
115
  governor = new DefifaGovernor(jbController(), address(this));
115
116
  JBAddressRegistry _registry = new JBAddressRegistry();
116
- DefifaTokenUriResolver _tokenURIResolver = new DefifaTokenUriResolver(ITypeface(address(0)));
117
+ DefifaTokenUriResolver _tokenUriResolver = new DefifaTokenUriResolver(ITypeface(address(0)));
117
118
  deployer = new DefifaDeployer(
118
119
  address(hook),
119
- _tokenURIResolver,
120
+ _tokenUriResolver,
120
121
  governor,
121
122
  jbController(),
122
123
  _registry,
@@ -281,6 +282,7 @@ contract DefifaHookRegressions is JBTest, TestBaseWorkflow {
281
282
  // Transfer through 3 undelegated recipients sequentially.
282
283
  address currentHolder = playerA;
283
284
  for (uint256 i = 0; i < 3; i++) {
285
+ // forge-lint: disable-next-line(unsafe-typecast)
284
286
  address nextRecipient = address(uint160(0xBEEF0000 + i));
285
287
 
286
288
  vm.prank(currentHolder);
@@ -1,20 +1,37 @@
1
1
  // SPDX-License-Identifier: UNLICENSED
2
2
  pragma solidity 0.8.26;
3
3
 
4
- import "forge-std/Test.sol";
5
- import "../src/DefifaGovernor.sol";
6
- import "../src/DefifaDeployer.sol";
7
- import "../src/DefifaHook.sol";
8
- import "../src/DefifaTokenUriResolver.sol";
9
- import "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
10
-
11
- import {JBMetadataResolver} from "@bananapus/core-v6/src/libraries/JBMetadataResolver.sol";
4
+ import {Test} from "forge-std/Test.sol";
5
+ import {DefifaGovernor} from "../src/DefifaGovernor.sol";
6
+ import {DefifaDeployer} from "../src/DefifaDeployer.sol";
7
+ import {DefifaHook} from "../src/DefifaHook.sol";
8
+ import {DefifaTokenUriResolver} from "../src/DefifaTokenUriResolver.sol";
9
+ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
10
+
12
11
  import {MetadataResolverHelper} from "@bananapus/core-v6/test/helpers/MetadataResolverHelper.sol";
13
- import "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
12
+ import {TestBaseWorkflow} from "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
14
13
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
15
- import "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
16
- import "@bananapus/721-hook-v6/src/libraries/JB721TiersRulesetMetadataResolver.sol";
17
- import "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
14
+ import {JBRulesetMetadataResolver} from "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
15
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
16
+ import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
17
+ import {DefifaLaunchProjectData} from "../src/structs/DefifaLaunchProjectData.sol";
18
+ import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
19
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
20
+ import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
21
+ import {IJB721TiersHookStore} from "@bananapus/721-hook-v6/src/interfaces/IJB721TiersHookStore.sol";
22
+ import {IJBMultiTerminal} from "@bananapus/core-v6/src/interfaces/IJBMultiTerminal.sol";
23
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesets.sol";
24
+ import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
25
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
26
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
27
+ import {JBCurrencyIds} from "@bananapus/core-v6/src/libraries/JBCurrencyIds.sol";
28
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
29
+ import {JBMultiTerminal} from "@bananapus/core-v6/src/JBMultiTerminal.sol";
30
+ import {JBRulesetConfig, JBTerminalConfig} from "@bananapus/core-v6/src/interfaces/IJBController.sol";
31
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
32
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
33
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
34
+ import {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
18
35
 
19
36
  /// @title MintCostHandler
20
37
  /// @notice Stateful fuzz handler that performs pay and refund operations,
@@ -72,6 +89,7 @@ contract MintCostHandler is Test {
72
89
  vm.deal(user, tierPrice);
73
90
 
74
91
  uint16[] memory m = new uint16[](1);
92
+ // forge-lint: disable-next-line(unsafe-typecast)
75
93
  m[0] = uint16(tierId);
76
94
  bytes[] memory data = new bytes[](1);
77
95
  data[0] = abi.encode(user, m);
@@ -246,6 +264,7 @@ contract DefifaMintCostInvariantTest is JBTest, TestBaseWorkflow {
246
264
  attestationStartTime: 0,
247
265
  attestationGracePeriod: 100_381,
248
266
  defaultAttestationDelegate: address(0),
267
+ // forge-lint: disable-next-line(unsafe-typecast)
249
268
  tierPrice: uint104(TIER_PRICE),
250
269
  tiers: tp,
251
270
  defaultTokenUriResolver: IJB721TokenUriResolver(address(0)),
@@ -1,20 +1,38 @@
1
1
  // SPDX-License-Identifier: UNLICENSED
2
2
  pragma solidity 0.8.26;
3
3
 
4
- import "forge-std/Test.sol";
5
- import "../src/DefifaGovernor.sol";
6
- import "../src/DefifaDeployer.sol";
7
- import "../src/DefifaHook.sol";
8
- import "../src/DefifaTokenUriResolver.sol";
9
- import "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
10
-
11
- import {JBMetadataResolver} from "@bananapus/core-v6/src/libraries/JBMetadataResolver.sol";
12
- import {MetadataResolverHelper} from "@bananapus/core-v6/test/helpers/MetadataResolverHelper.sol";
13
- import "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
4
+ import {DefifaGovernor} from "../src/DefifaGovernor.sol";
5
+ import {DefifaDeployer} from "../src/DefifaDeployer.sol";
6
+ import {DefifaHook} from "../src/DefifaHook.sol";
7
+ import {DefifaTokenUriResolver} from "../src/DefifaTokenUriResolver.sol";
8
+ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
9
+
10
+ import {TestBaseWorkflow} from "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
14
11
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
15
- import "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
16
- import "@bananapus/721-hook-v6/src/libraries/JB721TiersRulesetMetadataResolver.sol";
17
- import "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
12
+ import {JBRulesetMetadataResolver} from "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
13
+ import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
14
+
15
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
16
+ import {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
17
+ import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
18
+ import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
19
+ import {DefifaDelegation} from "../src/structs/DefifaDelegation.sol";
20
+ import {DefifaLaunchProjectData} from "../src/structs/DefifaLaunchProjectData.sol";
21
+ import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
22
+ import {DefifaTierCashOutWeight} from "../src/structs/DefifaTierCashOutWeight.sol";
23
+ import {DefifaGamePhase} from "../src/enums/DefifaGamePhase.sol";
24
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
25
+ import {JBTerminalConfig} from "@bananapus/core-v6/src/structs/JBTerminalConfig.sol";
26
+ import {JBRulesetConfig} from "@bananapus/core-v6/src/structs/JBRulesetConfig.sol";
27
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
28
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
29
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
30
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
31
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
32
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
33
+ import {JBCurrencyIds} from "@bananapus/core-v6/src/libraries/JBCurrencyIds.sol";
34
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetApprovalHook.sol";
35
+ import {JBMultiTerminal} from "@bananapus/core-v6/src/JBMultiTerminal.sol";
18
36
 
19
37
  /// @title DefifaNoContestTest
20
38
  /// @notice Tests for the NO_CONTEST safety mechanisms: minParticipation threshold and scorecardTimeout.
@@ -802,6 +820,7 @@ contract DefifaNoContestTest is JBTest, TestBaseWorkflow {
802
820
  attestationStartTime: 0,
803
821
  attestationGracePeriod: 100_381,
804
822
  defaultAttestationDelegate: address(0),
823
+ // forge-lint: disable-next-line(unsafe-typecast)
805
824
  tierPrice: uint104(tierPrice),
806
825
  tiers: tp,
807
826
  defaultTokenUriResolver: IJB721TokenUriResolver(address(0)),
@@ -830,6 +849,7 @@ contract DefifaNoContestTest is JBTest, TestBaseWorkflow {
830
849
  function _mint(address user, uint256 tid, uint256 amt) internal {
831
850
  vm.deal(user, amt);
832
851
  uint16[] memory m = new uint16[](1);
852
+ // forge-lint: disable-next-line(unsafe-typecast)
833
853
  m[0] = uint16(tid);
834
854
  bytes[] memory data = new bytes[](1);
835
855
  data[0] = abi.encode(user, m);
@@ -872,9 +892,7 @@ contract DefifaNoContestTest is JBTest, TestBaseWorkflow {
872
892
  }
873
893
 
874
894
  function _surplus() internal view returns (uint256) {
875
- return
876
- jbMultiTerminal()
877
- .currentSurplusOf(_pid, jbMultiTerminal().accountingContextsOf(_pid), 18, JBCurrencyIds.ETH);
895
+ return jbMultiTerminal().currentSurplusOf(_pid, new address[](0), 18, JBCurrencyIds.ETH);
878
896
  }
879
897
 
880
898
  function _cashOut(address user, uint256 tid, uint256 tnum) internal {
@@ -1,20 +1,38 @@
1
1
  // SPDX-License-Identifier: UNLICENSED
2
2
  pragma solidity 0.8.26;
3
3
 
4
- import "forge-std/Test.sol";
5
- import "../src/DefifaGovernor.sol";
6
- import "../src/DefifaDeployer.sol";
7
- import "../src/DefifaHook.sol";
8
- import "../src/DefifaTokenUriResolver.sol";
9
- import "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
10
-
11
- import {JBMetadataResolver} from "@bananapus/core-v6/src/libraries/JBMetadataResolver.sol";
12
- import {MetadataResolverHelper} from "@bananapus/core-v6/test/helpers/MetadataResolverHelper.sol";
13
- import "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
4
+ import {DefifaGovernor} from "../src/DefifaGovernor.sol";
5
+ import {DefifaDeployer} from "../src/DefifaDeployer.sol";
6
+ import {DefifaHook} from "../src/DefifaHook.sol";
7
+ import {DefifaTokenUriResolver} from "../src/DefifaTokenUriResolver.sol";
8
+ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
9
+
10
+ import {TestBaseWorkflow} from "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
14
11
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
15
- import "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
16
- import "@bananapus/721-hook-v6/src/libraries/JB721TiersRulesetMetadataResolver.sol";
17
- import "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
12
+ import {JBRulesetMetadataResolver} from "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
13
+ import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
14
+
15
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
16
+ import {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
17
+ import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
18
+ import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
19
+ import {JB721TiersMintReservesConfig} from "@bananapus/721-hook-v6/src/structs/JB721TiersMintReservesConfig.sol";
20
+ import {DefifaDelegation} from "../src/structs/DefifaDelegation.sol";
21
+ import {DefifaLaunchProjectData} from "../src/structs/DefifaLaunchProjectData.sol";
22
+ import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
23
+ import {DefifaTierCashOutWeight} from "../src/structs/DefifaTierCashOutWeight.sol";
24
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
25
+ import {JBTerminalConfig} from "@bananapus/core-v6/src/structs/JBTerminalConfig.sol";
26
+ import {JBRulesetConfig} from "@bananapus/core-v6/src/structs/JBRulesetConfig.sol";
27
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
28
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
29
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
30
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
31
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
32
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
33
+ import {JBCurrencyIds} from "@bananapus/core-v6/src/libraries/JBCurrencyIds.sol";
34
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetApprovalHook.sol";
35
+ import {JBMultiTerminal} from "@bananapus/core-v6/src/JBMultiTerminal.sol";
18
36
 
19
37
  /// @dev Helper to read block.timestamp via an external call, bypassing the via-ir optimizer's timestamp caching.
20
38
  contract TimestampReader {
@@ -270,9 +288,9 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
270
288
  // =========================================================================
271
289
  function testFuzz_fundConservation(uint8 rawTiers, uint8 rawPlayers) external {
272
290
  uint8 nTiers = uint8(bound(rawTiers, 2, 12));
273
- uint8 nPPT = uint8(bound(rawPlayers, 1, 3));
291
+ uint8 nPpt = uint8(bound(rawPlayers, 1, 3));
274
292
 
275
- _setupMultiN(nTiers, nPPT, 1 ether);
293
+ _setupMultiN(nTiers, nPpt, 1 ether);
276
294
  _toScoring();
277
295
 
278
296
  uint256 tw = _nft.TOTAL_CASHOUT_WEIGHT();
@@ -295,8 +313,8 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
295
313
  uint256 total;
296
314
  for (uint256 i; i < _users.length; i++) {
297
315
  uint256 bb = _users[i].balance;
298
- uint256 tid = (i / nPPT) + 1;
299
- uint256 tnum = (i % nPPT) + 1;
316
+ uint256 tid = (i / nPpt) + 1;
317
+ uint256 tnum = (i % nPpt) + 1;
300
318
  _cashOut(_users[i], tid, tnum);
301
319
  total += _users[i].balance - bb;
302
320
  }
@@ -498,7 +516,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
498
516
  // =========================================================================
499
517
 
500
518
  function _setupGame(uint8 nTiers, uint256 tierPrice) internal {
501
- DefifaLaunchProjectData memory d = _launch_data(nTiers, tierPrice);
519
+ DefifaLaunchProjectData memory d = _launchData(nTiers, tierPrice);
502
520
  (_pid, _nft, _gov) = _launch(d);
503
521
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
504
522
  _users = new address[](nTiers);
@@ -511,7 +529,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
511
529
  }
512
530
 
513
531
  function _setupMultiPlayer() internal {
514
- DefifaLaunchProjectData memory d = _launch_data(4, 1 ether);
532
+ DefifaLaunchProjectData memory d = _launchData(4, 1 ether);
515
533
  (_pid, _nft, _gov) = _launch(d);
516
534
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
517
535
  _users = new address[](8);
@@ -529,15 +547,15 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
529
547
  }
530
548
  }
531
549
 
532
- function _setupMultiN(uint8 nTiers, uint8 nPPT, uint256 tierPrice) internal {
533
- DefifaLaunchProjectData memory d = _launch_data(nTiers, tierPrice);
550
+ function _setupMultiN(uint8 nTiers, uint8 nPpt, uint256 tierPrice) internal {
551
+ DefifaLaunchProjectData memory d = _launchData(nTiers, tierPrice);
534
552
  (_pid, _nft, _gov) = _launch(d);
535
553
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
536
- uint256 total = uint256(nTiers) * uint256(nPPT);
554
+ uint256 total = uint256(nTiers) * uint256(nPpt);
537
555
  _users = new address[](total);
538
556
  uint256 idx;
539
557
  for (uint256 t; t < nTiers; t++) {
540
- for (uint256 p; p < nPPT; p++) {
558
+ for (uint256 p; p < nPpt; p++) {
541
559
  _users[idx] = _addr(idx);
542
560
  _mint(_users[idx], t + 1, tierPrice);
543
561
  _delegateSelf(_users[idx], t + 1);
@@ -548,7 +566,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
548
566
  }
549
567
 
550
568
  function _setupPartial(uint8 nTiers, uint256 nMint, uint256 tierPrice) internal {
551
- DefifaLaunchProjectData memory d = _launch_data(nTiers, tierPrice);
569
+ DefifaLaunchProjectData memory d = _launchData(nTiers, tierPrice);
552
570
  (_pid, _nft, _gov) = _launch(d);
553
571
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
554
572
  _users = new address[](nMint);
@@ -567,7 +585,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
567
585
  // PRIMITIVE HELPERS
568
586
  // =========================================================================
569
587
 
570
- function _launch_data(uint8 n, uint256 tierPrice) internal returns (DefifaLaunchProjectData memory) {
588
+ function _launchData(uint8 n, uint256 tierPrice) internal returns (DefifaLaunchProjectData memory) {
571
589
  DefifaTierParams[] memory tp = new DefifaTierParams[](n);
572
590
  for (uint256 i; i < n; i++) {
573
591
  tp[i] = DefifaTierParams({
@@ -592,6 +610,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
592
610
  attestationStartTime: 0,
593
611
  attestationGracePeriod: 100_381,
594
612
  defaultAttestationDelegate: address(0),
613
+ // forge-lint: disable-next-line(unsafe-typecast)
595
614
  tierPrice: uint104(tierPrice),
596
615
  tiers: tp,
597
616
  defaultTokenUriResolver: IJB721TokenUriResolver(address(0)),
@@ -616,6 +635,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
616
635
  function _mint(address user, uint256 tid, uint256 amt) internal {
617
636
  vm.deal(user, amt);
618
637
  uint16[] memory m = new uint16[](1);
638
+ // forge-lint: disable-next-line(unsafe-typecast)
619
639
  m[0] = uint16(tid);
620
640
  bytes[] memory data = new bytes[](1);
621
641
  data[0] = abi.encode(user, m);
@@ -658,9 +678,7 @@ contract DefifaSecurityTest is JBTest, TestBaseWorkflow {
658
678
  }
659
679
 
660
680
  function _surplus() internal view returns (uint256) {
661
- return
662
- jbMultiTerminal()
663
- .currentSurplusOf(_pid, jbMultiTerminal().accountingContextsOf(_pid), 18, JBCurrencyIds.ETH);
681
+ return jbMultiTerminal().currentSurplusOf(_pid, new address[](0), 18, JBCurrencyIds.ETH);
664
682
  }
665
683
 
666
684
  function _cashOut(address user, uint256 tid, uint256 tnum) internal {
@@ -1,32 +1,38 @@
1
1
  // SPDX-License-Identifier: UNLICENSED
2
2
  pragma solidity 0.8.26;
3
3
 
4
- import "forge-std/Test.sol";
5
- import "../src/DefifaGovernor.sol";
6
- import "../src/DefifaDeployer.sol";
7
- import "../src/DefifaHook.sol";
8
- import "../src/DefifaTokenUriResolver.sol";
9
- import "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
10
-
11
- import {JBMetadataResolver} from "@bananapus/core-v6/src/libraries/JBMetadataResolver.sol";
12
- import {MetadataResolverHelper} from "@bananapus/core-v6/test/helpers/MetadataResolverHelper.sol";
13
- import "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
4
+ import {DefifaGovernor} from "../src/DefifaGovernor.sol";
5
+ import {DefifaDeployer} from "../src/DefifaDeployer.sol";
6
+ import {DefifaHook} from "../src/DefifaHook.sol";
7
+ import {DefifaTokenUriResolver} from "../src/DefifaTokenUriResolver.sol";
8
+ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
9
+
10
+ import {TestBaseWorkflow} from "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
14
11
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
15
- import "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
16
- import "@bananapus/721-hook-v6/src/libraries/JB721TiersRulesetMetadataResolver.sol";
17
- import "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
12
+ import {JBRulesetMetadataResolver} from "@bananapus/core-v6/src/libraries/JBRulesetMetadataResolver.sol";
13
+ import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
18
14
  import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
19
15
  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
20
16
  import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
21
17
  import {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
22
18
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
23
- import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
24
19
  import {DefifaDelegation} from "../src/structs/DefifaDelegation.sol";
25
20
  import {DefifaLaunchProjectData} from "../src/structs/DefifaLaunchProjectData.sol";
26
21
  import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
27
22
  import {DefifaTierCashOutWeight} from "../src/structs/DefifaTierCashOutWeight.sol";
28
23
  import {DefifaGamePhase} from "../src/enums/DefifaGamePhase.sol";
29
- import {DefifaScorecardState} from "../src/enums/DefifaScorecardState.sol";
24
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
25
+ import {JBTerminalConfig} from "@bananapus/core-v6/src/structs/JBTerminalConfig.sol";
26
+ import {JBRulesetConfig} from "@bananapus/core-v6/src/structs/JBRulesetConfig.sol";
27
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
28
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
29
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
30
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
31
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
32
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
33
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetApprovalHook.sol";
34
+ import {JBMultiTerminal} from "@bananapus/core-v6/src/JBMultiTerminal.sol";
35
+ import {JBPermissionsData} from "@bananapus/core-v6/src/structs/JBPermissionsData.sol";
30
36
 
31
37
  /// @notice Mock USDC token with 6 decimals.
32
38
  contract DefifaMockUSDC is ERC20 {
@@ -147,7 +153,10 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
147
153
  .setPermissionsFor(
148
154
  projectOwner,
149
155
  JBPermissionsData({
150
- operator: address(deployer), projectId: uint64(_defifaProjectId), permissionIds: permissionIds
156
+ operator: address(deployer),
157
+ // forge-lint: disable-next-line(unsafe-typecast)
158
+ projectId: uint64(_defifaProjectId),
159
+ permissionIds: permissionIds
151
160
  })
152
161
  );
153
162
 
@@ -159,11 +168,11 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
159
168
  // USDC LAUNCH DATA HELPERS
160
169
  // =========================================================================
161
170
 
162
- function _launchDataUSDC(uint8 n, uint104 tierPrice) internal returns (DefifaLaunchProjectData memory) {
163
- return _launchDataUSDCWith(n, tierPrice, 0, 0);
171
+ function _launchDataUsdc(uint8 n, uint104 tierPrice) internal returns (DefifaLaunchProjectData memory) {
172
+ return _launchDataUsdcWith(n, tierPrice, 0, 0);
164
173
  }
165
174
 
166
- function _launchDataUSDCWith(
175
+ function _launchDataUsdcWith(
167
176
  uint8 n,
168
177
  uint104 tierPrice,
169
178
  uint256 minParticipation,
@@ -218,9 +227,10 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
218
227
  return address(bytes20(keccak256(abi.encode("usdc_user", i))));
219
228
  }
220
229
 
221
- function _mintUSDC(address user, uint256 tid, uint104 amt) internal {
230
+ function _mintUsdc(address user, uint256 tid, uint104 amt) internal {
222
231
  usdc.mint(user, amt);
223
232
  uint16[] memory m = new uint16[](1);
233
+ // forge-lint: disable-next-line(unsafe-typecast)
224
234
  m[0] = uint16(tid);
225
235
  bytes[] memory data = new bytes[](1);
226
236
  data[0] = abi.encode(user, m);
@@ -278,14 +288,14 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
278
288
  vm.warp(_tsReader.timestamp() + 3 days + 1);
279
289
  }
280
290
 
281
- function _setupGameUSDC(uint8 nTiers, uint104 tierPrice) internal {
282
- DefifaLaunchProjectData memory d = _launchDataUSDC(nTiers, tierPrice);
291
+ function _setupGameUsdc(uint8 nTiers, uint104 tierPrice) internal {
292
+ DefifaLaunchProjectData memory d = _launchDataUsdc(nTiers, tierPrice);
283
293
  (_pid, _nft, _gov) = _launch(d);
284
294
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
285
295
  _users = new address[](nTiers);
286
296
  for (uint256 i; i < nTiers; i++) {
287
297
  _users[i] = _addr(i);
288
- _mintUSDC(_users[i], i + 1, tierPrice);
298
+ _mintUsdc(_users[i], i + 1, tierPrice);
289
299
  _delegateSelf(_users[i], i + 1);
290
300
  vm.warp(_tsReader.timestamp() + 1);
291
301
  }
@@ -296,8 +306,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
296
306
  }
297
307
 
298
308
  function _surplus() internal view returns (uint256) {
299
- return jbMultiTerminal()
300
- .currentSurplusOf(_pid, jbMultiTerminal().accountingContextsOf(_pid), 6, uint32(uint160(address(usdc))));
309
+ return jbMultiTerminal().currentSurplusOf(_pid, new address[](0), 6, uint32(uint160(address(usdc))));
301
310
  }
302
311
 
303
312
  function _generateTokenId(uint256 tierId, uint256 tokenNumber) internal pure returns (uint256) {
@@ -312,7 +321,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
312
321
  return metadataHelper().createMetadata(ids, datas);
313
322
  }
314
323
 
315
- function _cashOutUSDC(address user, uint256 tid, uint256 tnum) internal {
324
+ function _cashOutUsdc(address user, uint256 tid, uint256 tnum) internal {
316
325
  uint256[] memory cashOutIds = new uint256[](1);
317
326
  cashOutIds[0] = _generateTokenId(tid, tnum);
318
327
  bytes memory cashOutMetadata = _buildCashOutMetadata(abi.encode(cashOutIds));
@@ -330,7 +339,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
330
339
  });
331
340
  }
332
341
 
333
- function _refundUSDC(address user, uint256 tid) internal {
342
+ function _refundUsdc(address user, uint256 tid) internal {
334
343
  uint256[] memory cashOutIds = new uint256[](1);
335
344
  cashOutIds[0] = _generateTokenId(tid, 1);
336
345
  bytes memory cashOutMetadata = _buildCashOutMetadata(abi.encode(cashOutIds));
@@ -355,7 +364,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
355
364
  /// @notice Test 1: Mint and refund with USDC.
356
365
  function test_defifa_usdc_mintAndRefund() external {
357
366
  uint104 tierPrice = 100e6; // 100 USDC
358
- _setupGameUSDC(4, tierPrice);
367
+ _setupGameUsdc(4, tierPrice);
359
368
 
360
369
  // Verify MINT phase.
361
370
  assertEq(uint256(deployer.currentGamePhaseOf(_pid)), uint256(DefifaGamePhase.MINT));
@@ -370,7 +379,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
370
379
 
371
380
  // Refund user 0 during MINT phase.
372
381
  uint256 balBefore = usdc.balanceOf(_users[0]);
373
- _refundUSDC(_users[0], 1);
382
+ _refundUsdc(_users[0], 1);
374
383
  assertEq(usdc.balanceOf(_users[0]) - balBefore, 100e6, "refund = 100 USDC");
375
384
  assertEq(_nft.balanceOf(_users[0]), 0, "NFT burned on refund");
376
385
 
@@ -381,7 +390,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
381
390
  /// @notice Test 2: Scorecard and distribute with USDC.
382
391
  function test_defifa_usdc_scorecardAndDistribute() external {
383
392
  uint104 tierPrice = 100e6;
384
- _setupGameUSDC(4, tierPrice);
393
+ _setupGameUsdc(4, tierPrice);
385
394
 
386
395
  _toScoring();
387
396
 
@@ -394,14 +403,14 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
394
403
 
395
404
  // Winner cashes out -> receives USDC.
396
405
  uint256 winnerBalBefore = usdc.balanceOf(_users[0]);
397
- _cashOutUSDC(_users[0], 1, 1);
406
+ _cashOutUsdc(_users[0], 1, 1);
398
407
  uint256 winnerReceived = usdc.balanceOf(_users[0]) - winnerBalBefore;
399
408
  assertGt(winnerReceived, 0, "winner received USDC");
400
409
 
401
410
  // Losers get 0 USDC.
402
411
  for (uint256 i = 1; i < 4; i++) {
403
412
  uint256 bb = usdc.balanceOf(_users[i]);
404
- _cashOutUSDC(_users[i], i + 1, 1);
413
+ _cashOutUsdc(_users[i], i + 1, 1);
405
414
  assertEq(usdc.balanceOf(_users[i]), bb, "loser gets 0 USDC");
406
415
  }
407
416
  }
@@ -409,7 +418,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
409
418
  /// @notice Test 3: Fee accounting with USDC (6-decimal precision).
410
419
  function test_defifa_usdc_feeAccounting() external {
411
420
  uint104 tierPrice = 100e6;
412
- _setupGameUSDC(4, tierPrice);
421
+ _setupGameUsdc(4, tierPrice);
413
422
 
414
423
  uint256 potBefore = _balance();
415
424
  assertEq(potBefore, 400e6, "pot = 400 USDC");
@@ -432,14 +441,14 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
432
441
  /// @notice Test 4: No-contest with USDC (minParticipation threshold).
433
442
  function test_defifa_usdc_noContest() external {
434
443
  uint104 tierPrice = 100e6;
435
- DefifaLaunchProjectData memory d = _launchDataUSDCWith(4, tierPrice, 500e6, 0); // 500 USDC min
444
+ DefifaLaunchProjectData memory d = _launchDataUsdcWith(4, tierPrice, 500e6, 0); // 500 USDC min
436
445
  (_pid, _nft, _gov) = _launch(d);
437
446
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
438
447
 
439
448
  // Mint only 1 tier = 100 USDC < 500 USDC threshold.
440
449
  _users = new address[](1);
441
450
  _users[0] = _addr(0);
442
- _mintUSDC(_users[0], 1, tierPrice);
451
+ _mintUsdc(_users[0], 1, tierPrice);
443
452
 
444
453
  _toScoring();
445
454
 
@@ -450,7 +459,7 @@ contract DefifaUSDCTest is JBTest, TestBaseWorkflow {
450
459
  /// @notice Test 5: Game pot reporting with USDC.
451
460
  function test_defifa_usdc_potCalculation() external {
452
461
  uint104 tierPrice = 100e6;
453
- _setupGameUSDC(4, tierPrice);
462
+ _setupGameUsdc(4, tierPrice);
454
463
 
455
464
  _toScoring();
456
465