@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.
- package/ADMINISTRATION.md +3 -3
- package/ARCHITECTURE.md +2 -0
- package/AUDIT_INSTRUCTIONS.md +422 -0
- package/CRYPTO_ECON.md +5 -5
- package/README.md +1 -1
- package/RISKS.md +38 -335
- package/SKILLS.md +1 -1
- package/USER_JOURNEYS.md +691 -0
- package/package.json +7 -7
- package/script/Deploy.s.sol +14 -3
- package/script/helpers/DefifaDeploymentLib.sol +13 -15
- package/src/DefifaDeployer.sol +221 -192
- package/src/DefifaGovernor.sol +286 -276
- package/src/DefifaHook.sol +68 -34
- package/src/DefifaProjectOwner.sol +27 -4
- package/src/DefifaTokenUriResolver.sol +136 -134
- package/src/enums/DefifaGamePhase.sol +1 -1
- package/src/enums/DefifaScorecardState.sol +1 -1
- package/src/interfaces/IDefifaDeployer.sol +52 -50
- package/src/interfaces/IDefifaGamePhaseReporter.sol +2 -2
- package/src/interfaces/IDefifaGamePotReporter.sol +1 -1
- package/src/interfaces/IDefifaGovernor.sol +53 -54
- package/src/interfaces/IDefifaHook.sol +104 -103
- package/src/interfaces/IDefifaTokenUriResolver.sol +2 -2
- package/src/libraries/DefifaFontImporter.sol +11 -9
- package/src/libraries/DefifaHookLib.sol +66 -53
- package/src/structs/DefifaAttestations.sol +1 -1
- package/src/structs/DefifaDelegation.sol +1 -1
- package/src/structs/DefifaLaunchProjectData.sol +4 -4
- package/src/structs/DefifaOpsData.sol +1 -1
- package/src/structs/DefifaScorecard.sol +1 -1
- package/src/structs/DefifaTierCashOutWeight.sol +1 -1
- package/src/structs/DefifaTierParams.sol +2 -1
- package/test/DefifaAdversarialQuorum.t.sol +602 -0
- package/test/DefifaAuditLowGuards.t.sol +304 -0
- package/test/DefifaFeeAccounting.t.sol +37 -16
- package/test/DefifaGovernor.t.sol +43 -19
- package/test/DefifaHookRegressions.t.sol +14 -12
- package/test/DefifaMintCostInvariant.t.sol +31 -12
- package/test/DefifaNoContest.t.sol +34 -16
- package/test/DefifaSecurity.t.sol +46 -28
- package/test/DefifaUSDC.t.sol +45 -36
- package/test/Fork.t.sol +43 -43
- package/test/SVG.t.sol +2 -2
- package/test/TestAuditGaps.sol +982 -0
- package/test/TestQALastMile.t.sol +511 -0
- package/test/regression/FulfillmentBlocksRatification.t.sol +36 -30
- 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 "
|
|
5
|
-
import "../src/
|
|
6
|
-
import "../src/
|
|
7
|
-
import "../src/
|
|
8
|
-
import "
|
|
9
|
-
|
|
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/
|
|
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),
|
|
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
|
|
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
|
|
1870
|
+
uint8 nPpt = uint8(bound(rawPlayers, 1, 3));
|
|
1872
1871
|
|
|
1873
|
-
_setupMultiN(nTiers,
|
|
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 /
|
|
1895
|
-
uint256 tnum = (i %
|
|
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
|
|
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(
|
|
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 <
|
|
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);
|
|
@@ -2323,9 +2325,7 @@ contract DefifaForkTest is JBTest, TestBaseWorkflow {
|
|
|
2323
2325
|
}
|
|
2324
2326
|
|
|
2325
2327
|
function _surplus() internal view returns (uint256) {
|
|
2326
|
-
return
|
|
2327
|
-
jbMultiTerminal()
|
|
2328
|
-
.currentSurplusOf(_pid, jbMultiTerminal().accountingContextsOf(_pid), 18, JBCurrencyIds.ETH);
|
|
2328
|
+
return jbMultiTerminal().currentSurplusOf(_pid, new address[](0), 18, JBCurrencyIds.ETH);
|
|
2329
2329
|
}
|
|
2330
2330
|
|
|
2331
2331
|
function _balance() internal view returns (uint256) {
|
package/test/SVG.t.sol
CHANGED