@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,15 +1,15 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.17;
3
3
 
4
- import {mulDiv} from "@prb/math/src/Common.sol";
5
- import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
6
- import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
7
4
  import {IJB721TiersHookStore} from "@bananapus/721-hook-v6/src/interfaces/IJB721TiersHookStore.sol";
8
5
  import {JB721Tier} from "@bananapus/721-hook-v6/src/structs/JB721Tier.sol";
9
- import {DefifaTierCashOutWeight} from "../structs/DefifaTierCashOutWeight.sol";
6
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
8
+ import {mulDiv} from "@prb/math/src/Common.sol";
9
+
10
10
  import {DefifaGamePhase} from "../enums/DefifaGamePhase.sol";
11
+ import {DefifaTierCashOutWeight} from "../structs/DefifaTierCashOutWeight.sol";
11
12
 
12
- /// @title DefifaHookLib
13
13
  /// @notice Pure/view helper functions extracted from DefifaHook to reduce contract bytecode size.
14
14
  /// @dev Public library functions are deployed separately and called via delegatecall, so their bytecode does not count
15
15
  /// toward the calling contract's EIP-170 size limit.
@@ -29,12 +29,12 @@ library DefifaHookLib {
29
29
 
30
30
  /// @notice Validates tier cash out weights and returns the weight array to store.
31
31
  /// @param tierWeights The tier weights to validate and set.
32
- /// @param _store The 721 tiers hook store.
32
+ /// @param hookStore The 721 tiers hook store.
33
33
  /// @param hook The hook address.
34
34
  /// @return weights The 128-element array of validated weights.
35
35
  function validateAndBuildWeights(
36
36
  DefifaTierCashOutWeight[] memory tierWeights,
37
- IJB721TiersHookStore _store,
37
+ IJB721TiersHookStore hookStore,
38
38
  address hook
39
39
  )
40
40
  public
@@ -42,7 +42,7 @@ library DefifaHookLib {
42
42
  returns (uint256[128] memory weights)
43
43
  {
44
44
  // Keep a reference to the max tier ID.
45
- uint256 _maxTierId = _store.maxTierIdOf(hook);
45
+ uint256 _maxTierId = hookStore.maxTierIdOf(hook);
46
46
 
47
47
  // Keep a reference to the cumulative amounts.
48
48
  uint256 _cumulativeCashOutWeight;
@@ -62,7 +62,7 @@ library DefifaHookLib {
62
62
  _lastTierId = tierWeights[_i].id;
63
63
 
64
64
  // Get the tier.
65
- _tier = _store.tierOf({hook: hook, id: tierWeights[_i].id, includeResolvedUri: false});
65
+ _tier = hookStore.tierOf({hook: hook, id: tierWeights[_i].id, includeResolvedUri: false});
66
66
 
67
67
  // Can't set a cashOut weight for tiers not in category 0.
68
68
  if (_tier.category != 0) revert DefifaHook_InvalidTierId();
@@ -87,14 +87,14 @@ library DefifaHookLib {
87
87
 
88
88
  /// @notice Compute the cash out weight for a single token.
89
89
  /// @param tokenId The token ID.
90
- /// @param _store The 721 tiers hook store.
90
+ /// @param hookStore The 721 tiers hook store.
91
91
  /// @param hook The hook address.
92
92
  /// @param tierCashOutWeights The tier cash out weights array.
93
93
  /// @param tokensRedeemedFrom The mapping of tokens redeemed per tier (passed as a function that returns the value).
94
94
  /// @return The cash out weight.
95
95
  function computeCashOutWeight(
96
96
  uint256 tokenId,
97
- IJB721TiersHookStore _store,
97
+ IJB721TiersHookStore hookStore,
98
98
  address hook,
99
99
  uint256[128] storage tierCashOutWeights,
100
100
  mapping(uint256 => uint256) storage tokensRedeemedFrom
@@ -104,10 +104,10 @@ library DefifaHookLib {
104
104
  returns (uint256)
105
105
  {
106
106
  // Keep a reference to the token's tier ID.
107
- uint256 _tierId = _store.tierIdOfToken(tokenId);
107
+ uint256 _tierId = hookStore.tierIdOfToken(tokenId);
108
108
 
109
109
  // Keep a reference to the tier.
110
- JB721Tier memory _tier = _store.tierOf({hook: hook, id: _tierId, includeResolvedUri: false});
110
+ JB721Tier memory _tier = hookStore.tierOf({hook: hook, id: _tierId, includeResolvedUri: false});
111
111
 
112
112
  // Get the tier's weight.
113
113
  uint256 _weight = tierCashOutWeights[_tierId - 1];
@@ -116,7 +116,7 @@ library DefifaHookLib {
116
116
  if (_weight == 0) return 0;
117
117
 
118
118
  // Get the amount of tokens that have already been burned.
119
- uint256 _burnedTokens = _store.numberOfBurnedFor({hook: hook, tierId: _tierId});
119
+ uint256 _burnedTokens = hookStore.numberOfBurnedFor({hook: hook, tierId: _tierId});
120
120
 
121
121
  // If no tiers were minted, nothing to redeem.
122
122
  if (_tier.initialSupply - (_tier.remainingSupply + _burnedTokens) == 0) return 0;
@@ -126,19 +126,22 @@ library DefifaHookLib {
126
126
  _tier.initialSupply - _tier.remainingSupply - (_burnedTokens - tokensRedeemedFrom[_tierId]);
127
127
 
128
128
  // Calculate the percentage of the tier cashOut amount a single token counts for.
129
+ // Integer division rounding in cashOutWeight is unavoidable in Solidity. Rounding direction
130
+ // (down) is consistent and conservative — it slightly favors the project over individual cash-out recipients.
131
+ // The maximum error per operation is 1 wei per division.
129
132
  return _weight / _totalTokensForCashoutInTier;
130
133
  }
131
134
 
132
135
  /// @notice Compute the cumulative cash out weight for multiple tokens.
133
136
  /// @param tokenIds The token IDs.
134
- /// @param _store The 721 tiers hook store.
137
+ /// @param hookStore The 721 tiers hook store.
135
138
  /// @param hook The hook address.
136
139
  /// @param tierCashOutWeights The tier cash out weights array.
137
140
  /// @param tokensRedeemedFrom The mapping of tokens redeemed per tier.
138
141
  /// @return cumulativeWeight The cumulative weight.
139
142
  function computeCashOutWeightBatch(
140
143
  uint256[] memory tokenIds,
141
- IJB721TiersHookStore _store,
144
+ IJB721TiersHookStore hookStore,
142
145
  address hook,
143
146
  uint256[128] storage tierCashOutWeights,
144
147
  mapping(uint256 => uint256) storage tokensRedeemedFrom
@@ -151,7 +154,7 @@ library DefifaHookLib {
151
154
  for (uint256 _i; _i < _tokenCount;) {
152
155
  cumulativeWeight += computeCashOutWeight({
153
156
  tokenId: tokenIds[_i],
154
- _store: _store,
157
+ hookStore: hookStore,
155
158
  hook: hook,
156
159
  tierCashOutWeights: tierCashOutWeights,
157
160
  tokensRedeemedFrom: tokensRedeemedFrom
@@ -164,7 +167,7 @@ library DefifaHookLib {
164
167
 
165
168
  /// @notice Compute the claimable token amounts for a set of token IDs.
166
169
  /// @param tokenIds The token IDs.
167
- /// @param _store The 721 tiers hook store.
170
+ /// @param hookStore The 721 tiers hook store.
168
171
  /// @param hook The hook address.
169
172
  /// @param totalMintCost The cumulative mint cost.
170
173
  /// @param defifaBalance The current $DEFIFA balance.
@@ -173,7 +176,7 @@ library DefifaHookLib {
173
176
  /// @return baseProtocolTokenAmount The claimable $BASE_PROTOCOL amount.
174
177
  function computeTokensClaim(
175
178
  uint256[] memory tokenIds,
176
- IJB721TiersHookStore _store,
179
+ IJB721TiersHookStore hookStore,
177
180
  address hook,
178
181
  uint256 totalMintCost,
179
182
  uint256 defifaBalance,
@@ -192,23 +195,25 @@ library DefifaHookLib {
192
195
  // Calculate the amount paid to mint the tokens that are being burned.
193
196
  uint256 _cumulativeMintPrice;
194
197
  for (uint256 _i; _i < _numberOfTokens; _i++) {
195
- _cumulativeMintPrice += _store.tierOfTokenId({hook: hook, tokenId: tokenIds[_i], includeResolvedUri: false})
198
+ _cumulativeMintPrice += hookStore.tierOfTokenId({
199
+ hook: hook, tokenId: tokenIds[_i], includeResolvedUri: false
200
+ })
196
201
  .price;
197
202
  }
198
203
 
199
204
  // Calculate the user's claimable amount proportional to what they paid.
200
- defifaTokenAmount = defifaBalance * _cumulativeMintPrice / totalMintCost;
201
- baseProtocolTokenAmount = baseProtocolBalance * _cumulativeMintPrice / totalMintCost;
205
+ defifaTokenAmount = mulDiv({x: defifaBalance, y: _cumulativeMintPrice, denominator: totalMintCost});
206
+ baseProtocolTokenAmount = mulDiv({x: baseProtocolBalance, y: _cumulativeMintPrice, denominator: totalMintCost});
202
207
  }
203
208
 
204
209
  /// @notice Compute the cumulative mint price for a set of token IDs.
205
210
  /// @param tokenIds The token IDs.
206
- /// @param _store The 721 tiers hook store.
211
+ /// @param hookStore The 721 tiers hook store.
207
212
  /// @param hook The hook address.
208
213
  /// @return cumulativeMintPrice The total mint price.
209
214
  function computeCumulativeMintPrice(
210
215
  uint256[] memory tokenIds,
211
- IJB721TiersHookStore _store,
216
+ IJB721TiersHookStore hookStore,
212
217
  address hook
213
218
  )
214
219
  public
@@ -217,7 +222,9 @@ library DefifaHookLib {
217
222
  {
218
223
  uint256 _numberOfTokenIds = tokenIds.length;
219
224
  for (uint256 _i; _i < _numberOfTokenIds; _i++) {
220
- cumulativeMintPrice += _store.tierOfTokenId({hook: hook, tokenId: tokenIds[_i], includeResolvedUri: false})
225
+ cumulativeMintPrice += hookStore.tierOfTokenId({
226
+ hook: hook, tokenId: tokenIds[_i], includeResolvedUri: false
227
+ })
221
228
  .price;
222
229
  }
223
230
  }
@@ -226,14 +233,14 @@ library DefifaHookLib {
226
233
  /// @param gamePhase The current game phase.
227
234
  /// @param cumulativeMintPrice The cumulative mint price of the tokens being cashed out.
228
235
  /// @param surplusValue The surplus value from the context.
229
- /// @param _amountRedeemed The amount already redeemed.
236
+ /// @param totalAmountRedeemed The amount already redeemed.
230
237
  /// @param cumulativeCashOutWeight The cumulative cash out weight of the tokens.
231
238
  /// @return cashOutCount The computed cash out count.
232
239
  function computeCashOutCount(
233
240
  DefifaGamePhase gamePhase,
234
241
  uint256 cumulativeMintPrice,
235
242
  uint256 surplusValue,
236
- uint256 _amountRedeemed,
243
+ uint256 totalAmountRedeemed,
237
244
  uint256 cumulativeCashOutWeight
238
245
  )
239
246
  public
@@ -249,18 +256,18 @@ library DefifaHookLib {
249
256
  } else {
250
257
  // If the game is in its scoring or complete phase, reclaim amount is based on the tier weights.
251
258
  cashOutCount = mulDiv({
252
- x: surplusValue + _amountRedeemed, y: cumulativeCashOutWeight, denominator: TOTAL_CASHOUT_WEIGHT
259
+ x: surplusValue + totalAmountRedeemed, y: cumulativeCashOutWeight, denominator: TOTAL_CASHOUT_WEIGHT
253
260
  });
254
261
  }
255
262
  }
256
263
 
257
264
  /// @notice Compute the current supply of a tier (minted - burned).
258
- /// @param _store The 721 tiers hook store.
265
+ /// @param hookStore The 721 tiers hook store.
259
266
  /// @param hook The hook address.
260
267
  /// @param tierId The ID of the tier.
261
268
  /// @return The current supply.
262
269
  function computeCurrentSupply(
263
- IJB721TiersHookStore _store,
270
+ IJB721TiersHookStore hookStore,
264
271
  address hook,
265
272
  uint256 tierId
266
273
  )
@@ -268,28 +275,28 @@ library DefifaHookLib {
268
275
  view
269
276
  returns (uint256)
270
277
  {
271
- JB721Tier memory _tier = _store.tierOf({hook: hook, id: tierId, includeResolvedUri: false});
272
- return _tier.initialSupply - (_tier.remainingSupply + _store.numberOfBurnedFor({hook: hook, tierId: tierId}));
278
+ JB721Tier memory _tier = hookStore.tierOf({hook: hook, id: tierId, includeResolvedUri: false});
279
+ return _tier.initialSupply - (_tier.remainingSupply + hookStore.numberOfBurnedFor({hook: hook, tierId: tierId}));
273
280
  }
274
281
 
275
282
  /// @notice Computes the attestation units for tiers during payment processing.
276
283
  /// @dev Returns parallel arrays: tier IDs, cumulative attestation units per tier, and whether to switch delegate.
277
- /// @param _tierIdsToMint The tier IDs being minted (must be in ascending order).
278
- /// @param _store The 721 tiers hook store.
284
+ /// @param tierIdsToMint The tier IDs being minted (must be in ascending order).
285
+ /// @param hookStore The 721 tiers hook store.
279
286
  /// @param hook The hook address.
280
287
  /// @return tierIds The unique tier IDs.
281
288
  /// @return attestationAmounts The cumulative attestation units for each unique tier.
282
289
  /// @return count The number of unique tiers.
283
290
  function computeAttestationUnits(
284
- uint16[] memory _tierIdsToMint,
285
- IJB721TiersHookStore _store,
291
+ uint16[] memory tierIdsToMint,
292
+ IJB721TiersHookStore hookStore,
286
293
  address hook
287
294
  )
288
295
  public
289
296
  view
290
297
  returns (uint256[] memory tierIds, uint256[] memory attestationAmounts, uint256 count)
291
298
  {
292
- uint256 _numberOfTiers = _tierIdsToMint.length;
299
+ uint256 _numberOfTiers = tierIdsToMint.length;
293
300
  tierIds = new uint256[](_numberOfTiers);
294
301
  attestationAmounts = new uint256[](_numberOfTiers);
295
302
 
@@ -300,17 +307,17 @@ library DefifaHookLib {
300
307
  uint256 _accumulated;
301
308
 
302
309
  for (uint256 _i; _i < _numberOfTiers;) {
303
- if (_currentTierId != _tierIdsToMint[_i]) {
310
+ if (_currentTierId != tierIdsToMint[_i]) {
304
311
  // Flush accumulated units for previous tier.
305
312
  if (_currentTierId != 0) {
306
313
  tierIds[count] = _currentTierId;
307
314
  attestationAmounts[count] = _accumulated;
308
315
  count++;
309
316
  }
310
- if (_tierIdsToMint[_i] < _currentTierId) revert DefifaHook_BadTierOrder();
311
- _currentTierId = _tierIdsToMint[_i];
317
+ if (tierIdsToMint[_i] < _currentTierId) revert DefifaHook_BadTierOrder();
318
+ _currentTierId = tierIdsToMint[_i];
312
319
  _attestationUnits =
313
- _store.tierOf({hook: hook, id: _currentTierId, includeResolvedUri: false}).votingUnits;
320
+ hookStore.tierOf({hook: hook, id: _currentTierId, includeResolvedUri: false}).votingUnits;
314
321
  _accumulated = _attestationUnits;
315
322
  } else {
316
323
  _accumulated += _attestationUnits;
@@ -329,31 +336,37 @@ library DefifaHookLib {
329
336
 
330
337
  /// @notice Claims the defifa and base protocol tokens for a beneficiary.
331
338
  /// @dev Executes via delegatecall, so `address(this)` is the calling contract. Transfers are from the hook's
332
- /// balance. @param _beneficiary The address to claim tokens for.
339
+ /// balance.
340
+ /// @param beneficiary The address to claim tokens for.
333
341
  /// @param shareToBeneficiary The share relative to the `outOfTotal` to send the user.
334
342
  /// @param outOfTotal The total share that the `shareToBeneficiary` is relative to.
335
- /// @param _defifaToken The $DEFIFA token.
336
- /// @param _baseProtocolToken The $BASE_PROTOCOL token.
343
+ /// @param defifaToken The $DEFIFA token.
344
+ /// @param baseProtocolToken The $BASE_PROTOCOL token.
337
345
  /// @return beneficiaryReceivedTokens A flag indicating if the beneficiary received any tokens.
338
346
  function claimTokensFor(
339
- address _beneficiary,
347
+ address beneficiary,
340
348
  uint256 shareToBeneficiary,
341
349
  uint256 outOfTotal,
342
- IERC20 _defifaToken,
343
- IERC20 _baseProtocolToken
350
+ IERC20 defifaToken,
351
+ IERC20 baseProtocolToken
344
352
  )
345
353
  public
346
354
  returns (bool beneficiaryReceivedTokens)
347
355
  {
348
356
  // Calculate the share of $DEFIFA and $BASE_PROTOCOL tokens to send.
349
- uint256 baseProtocolAmount = _baseProtocolToken.balanceOf(address(this)) * shareToBeneficiary / outOfTotal;
350
- uint256 defifaAmount = _defifaToken.balanceOf(address(this)) * shareToBeneficiary / outOfTotal;
357
+ // Rounding in fee token claims slightly favors later claimants because earlier claims round
358
+ // down, leaving fractionally more for subsequent claimants. The error is bounded by 1 wei per claim and is
359
+ // economically insignificant.
360
+ uint256 baseProtocolAmount =
361
+ mulDiv({x: baseProtocolToken.balanceOf(address(this)), y: shareToBeneficiary, denominator: outOfTotal});
362
+ uint256 defifaAmount =
363
+ mulDiv({x: defifaToken.balanceOf(address(this)), y: shareToBeneficiary, denominator: outOfTotal});
351
364
 
352
365
  // If there is an amount we should send, send it.
353
- if (defifaAmount != 0) _defifaToken.safeTransfer({to: _beneficiary, value: defifaAmount});
354
- if (baseProtocolAmount != 0) _baseProtocolToken.safeTransfer({to: _beneficiary, value: baseProtocolAmount});
366
+ if (defifaAmount != 0) defifaToken.safeTransfer({to: beneficiary, value: defifaAmount});
367
+ if (baseProtocolAmount != 0) baseProtocolToken.safeTransfer({to: beneficiary, value: baseProtocolAmount});
355
368
 
356
- emit ClaimedTokens(_beneficiary, defifaAmount, baseProtocolAmount, msg.sender);
369
+ emit ClaimedTokens(beneficiary, defifaAmount, baseProtocolAmount, msg.sender);
357
370
 
358
371
  return (defifaAmount != 0 || baseProtocolAmount != 0);
359
372
  }
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:param A count of attestations.
5
5
  /// @custom:param A mapping of which accounts have attested.
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:member delegatee The account to delegate tier voting units to.
5
5
  /// @custom:member tierId The ID of the tier to delegate voting units for.
@@ -1,14 +1,14 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
- import {DefifaTierParams} from "./DefifaTierParams.sol";
5
-
6
- import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
7
4
  import {IJB721TiersHookStore} from "@bananapus/721-hook-v6/src/interfaces/IJB721TiersHookStore.sol";
8
5
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
9
6
  import {IJBTerminal} from "@bananapus/core-v6/src/interfaces/IJBTerminal.sol";
7
+ import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
10
8
  import {JBSplit} from "@bananapus/core-v6/src/structs/JBSplit.sol";
11
9
 
10
+ import {DefifaTierParams} from "./DefifaTierParams.sol";
11
+
12
12
  /// @custom:member name The name of the game being created.
13
13
  /// @custom:member projectUri Metadata to associate with the project.
14
14
  /// @custom:member contractUri The URI to associate with the 721.
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:member token The token being used by the game.
5
5
  /// @custom:member start The time at which the game should start, measured in seconds.
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:member attestationsBegin The block at which attestations to the scorecard become allowed.
5
5
  /// @custom:member gracePeriodEnds The block at which the scorecard can become ratified.
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:member id The tier's ID.
5
5
  /// @custom:member cashOutWeight The weight that all tokens of this tier can be cashed out for.
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.26;
2
+ pragma solidity ^0.8.0;
3
3
 
4
4
  /// @custom:member name The name of the tier.
5
5
  /// @custom:member reservedRate The number of minted tokens needed in the tier to allow for minting another reserved
@@ -11,6 +11,7 @@ struct DefifaTierParams {
11
11
  string name;
12
12
  uint16 reservedRate;
13
13
  address reservedTokenBeneficiary;
14
+ // forge-lint: disable-next-line(mixed-case-variable)
14
15
  bytes32 encodedIPFSUri;
15
16
  bool shouldUseReservedTokenBeneficiaryAsDefault;
16
17
  }