@ballkidz/defifa 0.0.7 → 0.0.8

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 (46) hide show
  1. package/ADMINISTRATION.md +3 -3
  2. package/AUDIT_INSTRUCTIONS.md +422 -0
  3. package/CRYPTO_ECON.md +5 -5
  4. package/RISKS.md +38 -335
  5. package/SKILLS.md +1 -1
  6. package/USER_JOURNEYS.md +691 -0
  7. package/package.json +7 -7
  8. package/script/Deploy.s.sol +14 -3
  9. package/script/helpers/DefifaDeploymentLib.sol +13 -15
  10. package/src/DefifaDeployer.sol +221 -192
  11. package/src/DefifaGovernor.sol +286 -276
  12. package/src/DefifaHook.sol +65 -32
  13. package/src/DefifaProjectOwner.sol +27 -4
  14. package/src/DefifaTokenUriResolver.sol +136 -134
  15. package/src/enums/DefifaGamePhase.sol +1 -1
  16. package/src/enums/DefifaScorecardState.sol +1 -1
  17. package/src/interfaces/IDefifaDeployer.sol +52 -50
  18. package/src/interfaces/IDefifaGamePhaseReporter.sol +2 -2
  19. package/src/interfaces/IDefifaGamePotReporter.sol +1 -1
  20. package/src/interfaces/IDefifaGovernor.sol +53 -54
  21. package/src/interfaces/IDefifaHook.sol +104 -103
  22. package/src/interfaces/IDefifaTokenUriResolver.sol +2 -2
  23. package/src/libraries/DefifaFontImporter.sol +11 -9
  24. package/src/libraries/DefifaHookLib.sol +66 -53
  25. package/src/structs/DefifaAttestations.sol +1 -1
  26. package/src/structs/DefifaDelegation.sol +1 -1
  27. package/src/structs/DefifaLaunchProjectData.sol +4 -4
  28. package/src/structs/DefifaOpsData.sol +1 -1
  29. package/src/structs/DefifaScorecard.sol +1 -1
  30. package/src/structs/DefifaTierCashOutWeight.sol +1 -1
  31. package/src/structs/DefifaTierParams.sol +2 -1
  32. package/test/DefifaAdversarialQuorum.t.sol +602 -0
  33. package/test/DefifaAuditLowGuards.t.sol +304 -0
  34. package/test/DefifaFeeAccounting.t.sol +37 -16
  35. package/test/DefifaGovernor.t.sol +37 -11
  36. package/test/DefifaHookRegressions.t.sol +14 -12
  37. package/test/DefifaMintCostInvariant.t.sol +31 -12
  38. package/test/DefifaNoContest.t.sol +33 -13
  39. package/test/DefifaSecurity.t.sol +45 -25
  40. package/test/DefifaUSDC.t.sol +44 -34
  41. package/test/Fork.t.sol +42 -40
  42. package/test/SVG.t.sol +2 -2
  43. package/test/TestAuditGaps.sol +982 -0
  44. package/test/TestQALastMile.t.sol +511 -0
  45. package/test/regression/FulfillmentBlocksRatification.t.sol +36 -30
  46. package/test/regression/GracePeriodBypass.t.sol +15 -10
package/test/Fork.t.sol CHANGED
@@ -1,20 +1,16 @@
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 {ITypeface} from "lib/typeface/contracts/interfaces/ITypeface.sol";
@@ -26,6 +22,22 @@ import {DefifaTierParams} from "../src/structs/DefifaTierParams.sol";
26
22
  import {DefifaTierCashOutWeight} from "../src/structs/DefifaTierCashOutWeight.sol";
27
23
  import {DefifaGamePhase} from "../src/enums/DefifaGamePhase.sol";
28
24
  import {DefifaScorecardState} from "../src/enums/DefifaScorecardState.sol";
25
+ import {DefifaHookLib} from "../src/libraries/DefifaHookLib.sol";
26
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
27
+ import {JBTerminalConfig} from "@bananapus/core-v6/src/structs/JBTerminalConfig.sol";
28
+ import {JBRulesetConfig} from "@bananapus/core-v6/src/structs/JBRulesetConfig.sol";
29
+ import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
30
+ import {JBSplitGroup} from "@bananapus/core-v6/src/structs/JBSplitGroup.sol";
31
+ import {JBFundAccessLimitGroup} from "@bananapus/core-v6/src/structs/JBFundAccessLimitGroup.sol";
32
+ import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
33
+ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
34
+ import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
35
+ import {JBCurrencyIds} from "@bananapus/core-v6/src/libraries/JBCurrencyIds.sol";
36
+ import {IJBRulesetApprovalHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetApprovalHook.sol";
37
+ import {JBMultiTerminal} from "@bananapus/core-v6/src/JBMultiTerminal.sol";
38
+ import {JBPermissionsData} from "@bananapus/core-v6/src/structs/JBPermissionsData.sol";
39
+ import {IJBSplitHook} from "@bananapus/core-v6/src/interfaces/IJBSplitHook.sol";
40
+ import {JB721TiersMintReservesConfig} from "@bananapus/721-hook-v6/src/structs/JB721TiersMintReservesConfig.sol";
29
41
 
30
42
  /// @dev Helper to read block.timestamp via an external call, bypassing the via-ir optimizer's timestamp caching.
31
43
  contract TimestampReader {
@@ -133,7 +145,10 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
133
145
  .setPermissionsFor(
134
146
  projectOwner,
135
147
  JBPermissionsData({
136
- operator: address(deployer), projectId: uint64(_defifaProjectId), permissionIds: permissionIds
148
+ operator: address(deployer),
149
+ // forge-lint: disable-next-line(unsafe-typecast)
150
+ projectId: uint64(_defifaProjectId),
151
+ permissionIds: permissionIds
137
152
  })
138
153
  );
139
154
 
@@ -514,6 +529,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
514
529
  sc[i].cashOutWeight = _nft.TOTAL_CASHOUT_WEIGHT() / 8;
515
530
  }
516
531
  // Fix rounding for last tier.
532
+ // forge-lint: disable-next-line(divide-before-multiply)
517
533
  sc[7].cashOutWeight = _nft.TOTAL_CASHOUT_WEIGHT() - ((_nft.TOTAL_CASHOUT_WEIGHT() / 8) * 7);
518
534
 
519
535
  vm.expectRevert(DefifaGovernor.DefifaGovernor_UnownedProposedCashoutValue.selector);
@@ -1357,33 +1373,16 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
1357
1373
  function test_fork_delegateToZero_viaSetTierDelegateTo() external {
1358
1374
  _setupGame(4, 1 ether);
1359
1375
 
1360
- // setTierDelegateTo allows address(0) no check (unlike setTierDelegatesTo which reverts).
1376
+ // Both setTierDelegateTo and setTierDelegatesTo revert on address(0).
1361
1377
  vm.prank(_users[0]);
1378
+ vm.expectRevert(DefifaHook.DefifaHook_DelegateAddressZero.selector);
1362
1379
  _nft.setTierDelegateTo(address(0), 1);
1363
1380
 
1364
- // Verify setTierDelegatesTo would revert for address(0).
1365
1381
  DefifaDelegation[] memory dd = new DefifaDelegation[](1);
1366
1382
  dd[0] = DefifaDelegation({delegatee: address(0), tierId: 1});
1367
1383
  vm.prank(_users[0]);
1368
1384
  vm.expectRevert(DefifaHook.DefifaHook_DelegateAddressZero.selector);
1369
1385
  _nft.setTierDelegatesTo(dd);
1370
-
1371
- _toScoring();
1372
-
1373
- DefifaTierCashOutWeight[] memory sc = _evenScorecard(4);
1374
- uint256 pid = _gov.submitScorecardFor(_gameId, sc);
1375
-
1376
- uint256 attestStart = _gov.attestationStartTimeOf(_gameId);
1377
- uint256 current = _tsReader.timestamp();
1378
- vm.warp((attestStart > current ? attestStart : current) + 1);
1379
-
1380
- // After delegating to address(0), user's attestation power is reduced
1381
- // (delegate checkpoint partially drained). Verify it's less than a normal holder.
1382
- vm.prank(_users[0]);
1383
- uint256 w0 = _gov.attestToScorecardFrom(_gameId, pid);
1384
- vm.prank(_users[1]);
1385
- uint256 w1 = _gov.attestToScorecardFrom(_gameId, pid);
1386
- assertTrue(w0 < w1, "address(0) delegate has less power than normal delegate");
1387
1386
  }
1388
1387
 
1389
1388
  // =========================================================================
@@ -1868,9 +1867,9 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
1868
1867
 
1869
1868
  function test_fork_fuzz_fundConservation(uint8 rawTiers, uint8 rawPlayers) external {
1870
1869
  uint8 nTiers = uint8(bound(rawTiers, 2, 12));
1871
- uint8 nPPT = uint8(bound(rawPlayers, 1, 3));
1870
+ uint8 nPpt = uint8(bound(rawPlayers, 1, 3));
1872
1871
 
1873
- _setupMultiN(nTiers, nPPT, 1 ether);
1872
+ _setupMultiN(nTiers, nPpt, 1 ether);
1874
1873
  _toScoring();
1875
1874
 
1876
1875
  uint256 tw = _nft.TOTAL_CASHOUT_WEIGHT();
@@ -1891,8 +1890,8 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
1891
1890
  uint256 total;
1892
1891
  for (uint256 i; i < _users.length; i++) {
1893
1892
  uint256 bb = _users[i].balance;
1894
- uint256 tid = (i / nPPT) + 1;
1895
- uint256 tnum = (i % nPPT) + 1;
1893
+ uint256 tid = (i / nPpt) + 1;
1894
+ uint256 tnum = (i % nPpt) + 1;
1896
1895
  _cashOut(_users[i], tid, tnum);
1897
1896
  total += _users[i].balance - bb;
1898
1897
  }
@@ -2130,15 +2129,15 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
2130
2129
  }
2131
2130
  }
2132
2131
 
2133
- function _setupMultiN(uint8 nTiers, uint8 nPPT, uint256 tierPrice) internal {
2132
+ function _setupMultiN(uint8 nTiers, uint8 nPpt, uint256 tierPrice) internal {
2134
2133
  DefifaLaunchProjectData memory d = _launchData(nTiers, tierPrice);
2135
2134
  (_pid, _nft, _gov) = _launch(d);
2136
2135
  vm.warp(d.start - d.mintPeriodDuration - d.refundPeriodDuration);
2137
- uint256 total = uint256(nTiers) * uint256(nPPT);
2136
+ uint256 total = uint256(nTiers) * uint256(nPpt);
2138
2137
  _users = new address[](total);
2139
2138
  uint256 idx;
2140
2139
  for (uint256 t; t < nTiers; t++) {
2141
- for (uint256 p; p < nPPT; p++) {
2140
+ for (uint256 p; p < nPpt; p++) {
2142
2141
  _users[idx] = _addr(idx);
2143
2142
  _mint(_users[idx], t + 1, tierPrice);
2144
2143
  _delegateSelf(_users[idx], t + 1);
@@ -2196,6 +2195,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
2196
2195
  attestationStartTime: 0,
2197
2196
  attestationGracePeriod: 100_381,
2198
2197
  defaultAttestationDelegate: address(0),
2198
+ // forge-lint: disable-next-line(unsafe-typecast)
2199
2199
  tierPrice: uint104(tierPrice),
2200
2200
  tiers: _makeTierParams(n),
2201
2201
  defaultTokenUriResolver: IJB721TokenUriResolver(address(0)),
@@ -2227,6 +2227,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
2227
2227
  attestationStartTime: 0,
2228
2228
  attestationGracePeriod: 100_381,
2229
2229
  defaultAttestationDelegate: address(0),
2230
+ // forge-lint: disable-next-line(unsafe-typecast)
2230
2231
  tierPrice: uint104(tierPrice),
2231
2232
  tiers: _makeTierParams(n),
2232
2233
  defaultTokenUriResolver: IJB721TokenUriResolver(address(0)),
@@ -2264,6 +2265,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
2264
2265
  function _mint(address user, uint256 tid, uint256 amt) internal {
2265
2266
  vm.deal(user, amt);
2266
2267
  uint16[] memory m = new uint16[](1);
2268
+ // forge-lint: disable-next-line(unsafe-typecast)
2267
2269
  m[0] = uint16(tid);
2268
2270
  bytes[] memory data = new bytes[](1);
2269
2271
  data[0] = abi.encode(user, m);
package/test/SVG.t.sol CHANGED
@@ -1,5 +1,5 @@
1
- // // SPDX-License-Identifier: MIT
2
- // pragma solidity 0.8.26;
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.26;
3
3
  //
4
4
  // import "forge-std/Test.sol";
5
5
  //