Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
fcf5d21
use DVP in governor
godzillaba Oct 8, 2025
046dafd
first action
godzillaba Oct 8, 2025
ceac191
second action
godzillaba Oct 8, 2025
b07f5bb
fmt
godzillaba Oct 8, 2025
f72cb22
comment
godzillaba Oct 8, 2025
7c4b03b
Merge branch 'delegate-total-poc' into governor-dvp-poc
godzillaba Oct 8, 2025
d19c3e7
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 8, 2025
d68b715
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 8, 2025
01d7219
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 8, 2025
a132247
single action
godzillaba Oct 8, 2025
3af8bce
remove relic of dvp estimation in quorum calc
godzillaba Oct 8, 2025
7d93a5c
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 8, 2025
880fd53
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 9, 2025
20fe682
Revert "remove relic of dvp estimation in quorum calc"
godzillaba Oct 9, 2025
2704f5b
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 9, 2025
cd22eb5
Revert "single action"
godzillaba Oct 9, 2025
59da8db
keep old quorum behavior when checkpoint is old
godzillaba Oct 9, 2025
35c8728
add quorum clamping
godzillaba Oct 9, 2025
03570ff
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 9, 2025
45e28e1
set min/max quorum in action
godzillaba Oct 9, 2025
ae1e30c
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 9, 2025
7a032db
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 9, 2025
e331069
document quorum jumping on admin function
godzillaba Oct 9, 2025
dca9917
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 9, 2025
e4f5574
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 10, 2025
fd64927
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 10, 2025
081e4fb
comment
godzillaba Oct 10, 2025
9db37e7
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 10, 2025
0559cce
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 10, 2025
4325068
test governor dvp
godzillaba Oct 10, 2025
fc47702
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 10, 2025
e4a762b
fix rename functions
godzillaba Oct 12, 2025
b2a60a4
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 13, 2025
a7a402c
update sigs and storage
godzillaba Oct 13, 2025
e25e68c
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 13, 2025
649028d
update sigs and storage
godzillaba Oct 13, 2025
bbd50ff
fix test
godzillaba Oct 13, 2025
872a751
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 13, 2025
b72e580
add prop1 test, use relay
godzillaba Oct 13, 2025
29eb986
remove second action
godzillaba Oct 13, 2025
4644c7c
format
godzillaba Oct 13, 2025
b09a2e4
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 13, 2025
25c4c5e
add comment
godzillaba Oct 13, 2025
ee3b314
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 13, 2025
66af7e0
snapshot
godzillaba Oct 13, 2025
4782b2e
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 13, 2025
5f633d4
fix test path
godzillaba Oct 13, 2025
5df4a6c
snapshot
godzillaba Oct 13, 2025
97d1bf1
update sigs and storage
godzillaba Oct 13, 2025
3ee69c0
undo toml change
godzillaba Oct 13, 2025
d7d9408
Update src/gov-action-contracts/AIPs/TotalDvpQuorum/ActivateDvpQuorum…
godzillaba Oct 14, 2025
03dfabd
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 14, 2025
2c91ff3
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 14, 2025
97dd79f
Merge branch 'dvp-actions-poc' of https://github.com/ArbitrumFoundati…
godzillaba Oct 14, 2025
2168d83
Merge branch 'delegate-total-poc-fixed' into governor-dvp-poc
godzillaba Oct 15, 2025
86b6821
Merge branch 'governor-dvp-poc' into dvp-actions-poc
godzillaba Oct 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 46 additions & 44 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
AIP1Point2ActionTest:testAction() (gas: 629373)
AIP1Point2ActionTest:testAction() (gas: 629593)
AIPNovaFeeRoutingActionTest:testAction() (gas: 3074)
ActivateDvpQuorumActionTest:testAction() (gas: 3074)
ArbitrumDAOConstitutionTest:testConstructor() (gas: 259383)
ArbitrumDAOConstitutionTest:testMonOwnerCannotSetHash() (gas: 262836)
ArbitrumDAOConstitutionTest:testOwnerCanSetHash() (gas: 261148)
ArbitrumDAOConstitutionTest:testOwnerCanSetHashTwice() (gas: 263824)
ArbitrumFoundationVestingWalletTest:testBeneficiaryCanSetBeneficiary() (gas: 16650777)
ArbitrumFoundationVestingWalletTest:testMigrateEthToNewWalletWithSlowerVesting() (gas: 19563109)
ArbitrumFoundationVestingWalletTest:testMigrateTokensToNewWalletWithFasterVesting() (gas: 19566970)
ArbitrumFoundationVestingWalletTest:testMigrateTokensToNewWalletWithSlowerVesting() (gas: 19566915)
ArbitrumFoundationVestingWalletTest:testMigrationTargetMustBeContract() (gas: 16654110)
ArbitrumFoundationVestingWalletTest:testOnlyBeneficiaryCanRelease() (gas: 16646092)
ArbitrumFoundationVestingWalletTest:testOnlyOwnerCanMigrate() (gas: 16648441)
ArbitrumFoundationVestingWalletTest:testOwnerCanSetBeneficiary() (gas: 16650860)
ArbitrumFoundationVestingWalletTest:testProperlyInits() (gas: 16656252)
ArbitrumFoundationVestingWalletTest:testRandomAddressCantSetBeneficiary() (gas: 16648340)
ArbitrumFoundationVestingWalletTest:testRelease() (gas: 16773817)
ArbitrumFoundationVestingWalletTest:testBeneficiaryCanSetBeneficiary() (gas: 16813688)
ArbitrumFoundationVestingWalletTest:testMigrateEthToNewWalletWithSlowerVesting() (gas: 19726041)
ArbitrumFoundationVestingWalletTest:testMigrateTokensToNewWalletWithFasterVesting() (gas: 19729902)
ArbitrumFoundationVestingWalletTest:testMigrateTokensToNewWalletWithSlowerVesting() (gas: 19729847)
ArbitrumFoundationVestingWalletTest:testMigrationTargetMustBeContract() (gas: 16817021)
ArbitrumFoundationVestingWalletTest:testOnlyBeneficiaryCanRelease() (gas: 16809003)
ArbitrumFoundationVestingWalletTest:testOnlyOwnerCanMigrate() (gas: 16811352)
ArbitrumFoundationVestingWalletTest:testOwnerCanSetBeneficiary() (gas: 16813771)
ArbitrumFoundationVestingWalletTest:testProperlyInits() (gas: 16819184)
ArbitrumFoundationVestingWalletTest:testRandomAddressCantSetBeneficiary() (gas: 16811251)
ArbitrumFoundationVestingWalletTest:testRelease() (gas: 16936728)
ArbitrumVestingWalletFactoryTest:testDeploy() (gas: 4589688)
ArbitrumVestingWalletFactoryTest:testOnlyOwnerCanCreateWallets() (gas: 1504286)
ArbitrumVestingWalletTest:testCastVote() (gas: 16548556)
ArbitrumVestingWalletTest:testCastVoteFailsForNonBeneficiary() (gas: 16498401)
ArbitrumVestingWalletTest:testClaim() (gas: 16351666)
ArbitrumVestingWalletTest:testClaimFailsForNonBeneficiary() (gas: 16286661)
ArbitrumVestingWalletTest:testDelegate() (gas: 16428188)
ArbitrumVestingWalletTest:testDelegateFailsForNonBeneficiary() (gas: 16352311)
ArbitrumVestingWalletTest:testDoesDeploy() (gas: 16290048)
ArbitrumVestingWalletTest:testReleaseAffordance() (gas: 16352525)
ArbitrumVestingWalletTest:testVestedAmountStart() (gas: 16419145)
E2E:testE2E() (gas: 85120906)
ArbitrumVestingWalletTest:testCastVote() (gas: 16736828)
ArbitrumVestingWalletTest:testCastVoteFailsForNonBeneficiary() (gas: 16661155)
ArbitrumVestingWalletTest:testClaim() (gas: 16514555)
ArbitrumVestingWalletTest:testClaimFailsForNonBeneficiary() (gas: 16449550)
ArbitrumVestingWalletTest:testDelegate() (gas: 16591077)
ArbitrumVestingWalletTest:testDelegateFailsForNonBeneficiary() (gas: 16515200)
ArbitrumVestingWalletTest:testDoesDeploy() (gas: 16452937)
ArbitrumVestingWalletTest:testReleaseAffordance() (gas: 16515414)
ArbitrumVestingWalletTest:testVestedAmountStart() (gas: 16582034)
E2E:testE2E() (gas: 85121103)
FixedDelegateErc20WalletTest:testInit() (gas: 6095530)
FixedDelegateErc20WalletTest:testInitZeroToken() (gas: 6089082)
FixedDelegateErc20WalletTest:testTransfer() (gas: 6254297)
Expand Down Expand Up @@ -59,14 +60,15 @@ L1ArbitrumTokenTest:testRegisterTokenOnL2NotEnoughVal() (gas: 4425799)
L1GovernanceFactoryTest:testL1GovernanceFactory() (gas: 10771066)
L1GovernanceFactoryTest:testSetMinDelay() (gas: 10746048)
L1GovernanceFactoryTest:testSetMinDelayRevertsForCoreAddress() (gas: 10799003)
L2AddressRegistryTest:testAddressRegistryAddress() (gas: 54658)
L2ArbitrumGovernorTest:testCantReinit() (gas: 13941567)
L2ArbitrumGovernorTest:testExecutorPermissions() (gas: 13978561)
L2ArbitrumGovernorTest:testExecutorPermissionsFail() (gas: 13951213)
L2ArbitrumGovernorTest:testPastCirculatingSupply() (gas: 13945250)
L2ArbitrumGovernorTest:testPastCirculatingSupplyExclude() (gas: 14131053)
L2ArbitrumGovernorTest:testPastCirculatingSupplyMint() (gas: 14009617)
L2ArbitrumGovernorTest:testProperlyInitialized() (gas: 13936784)
L2AddressRegistryTest:testAddressRegistryAddress() (gas: 54702)
L2ArbitrumGovernorTest:testCantReinit() (gas: 14134098)
L2ArbitrumGovernorTest:testDVPQuorumAndClamping() (gas: 14388732)
L2ArbitrumGovernorTest:testExecutorPermissions() (gas: 14171159)
L2ArbitrumGovernorTest:testExecutorPermissionsFail() (gas: 14143656)
L2ArbitrumGovernorTest:testPastCirculatingSupply() (gas: 14137780)
L2ArbitrumGovernorTest:testPastCirculatingSupplyExclude() (gas: 14329812)
L2ArbitrumGovernorTest:testPastCirculatingSupplyMint() (gas: 14206327)
L2ArbitrumGovernorTest:testProperlyInitialized() (gas: 14131750)
L2ArbitrumTokenTest:testCanBurn() (gas: 4339618)
L2ArbitrumTokenTest:testCanMint2Percent() (gas: 4374369)
L2ArbitrumTokenTest:testCanMintLessThan2Percent() (gas: 4374349)
Expand All @@ -84,7 +86,7 @@ L2ArbitrumTokenTest:testDecreaseDVPOnUndelegate() (gas: 4449395)
L2ArbitrumTokenTest:testDoesNotInitialiseZeroInitialSup() (gas: 4072613)
L2ArbitrumTokenTest:testDoesNotInitialiseZeroL1Token() (gas: 4072620)
L2ArbitrumTokenTest:testDoesNotInitialiseZeroOwner() (gas: 4072678)
L2ArbitrumTokenTest:testDvpAdjustment(uint64,int64) (runs: 257, μ: 4384586, ~: 4386226)
L2ArbitrumTokenTest:testDvpAdjustment(uint64,int64) (runs: 256, μ: 4384593, ~: 4386226)
L2ArbitrumTokenTest:testDvpAtBlockBeforeFirstCheckpoint() (gas: 4387016)
L2ArbitrumTokenTest:testDvpDecreaseOnTransferFromDelegator() (gas: 4489912)
L2ArbitrumTokenTest:testDvpIncreaseOnTransferToDelegator() (gas: 4481315)
Expand All @@ -94,27 +96,27 @@ L2ArbitrumTokenTest:testDvpNoChangeOnTransferToNonDelegator() (gas: 4365723)
L2ArbitrumTokenTest:testDvpNoRevertOnUnderflow() (gas: 4468805)
L2ArbitrumTokenTest:testIncreaseDVPOnDelegateToAnother() (gas: 4455851)
L2ArbitrumTokenTest:testIncreaseDVPOnSelfDelegate() (gas: 4455973)
L2ArbitrumTokenTest:testInitialDvpEstimate(uint64) (runs: 257, μ: 4381466, ~: 4381466)
L2ArbitrumTokenTest:testInitialDvpEstimate(uint64) (runs: 256, μ: 4381466, ~: 4381466)
L2ArbitrumTokenTest:testIsInitialised() (gas: 4345304)
L2ArbitrumTokenTest:testNoChangeDVPOnRedelegateToSame() (gas: 4527875)
L2ArbitrumTokenTest:testNoLogicContractInit() (gas: 2964987)
L2GovernanceFactoryTest:testContractsDeployed() (gas: 28787689)
L2GovernanceFactoryTest:testContractsInitialized() (gas: 28824684)
L2GovernanceFactoryTest:testDeploySteps() (gas: 28799198)
L2GovernanceFactoryTest:testProxyAdminOwnership() (gas: 28796699)
L2GovernanceFactoryTest:testRoles() (gas: 28819686)
L2GovernanceFactoryTest:testSanityCheckValues() (gas: 28844027)
L2GovernanceFactoryTest:testSetMinDelay() (gas: 28792695)
L2GovernanceFactoryTest:testSetMinDelayRevertsForCoreAddress() (gas: 28845566)
L2GovernanceFactoryTest:testUpgraderCanCancel() (gas: 29131469)
L2GovernanceFactoryTest:testContractsDeployed() (gas: 29113300)
L2GovernanceFactoryTest:testContractsInitialized() (gas: 29150360)
L2GovernanceFactoryTest:testDeploySteps() (gas: 29124809)
L2GovernanceFactoryTest:testProxyAdminOwnership() (gas: 29122310)
L2GovernanceFactoryTest:testRoles() (gas: 29145297)
L2GovernanceFactoryTest:testSanityCheckValues() (gas: 29169793)
L2GovernanceFactoryTest:testSetMinDelay() (gas: 29118306)
L2GovernanceFactoryTest:testSetMinDelayRevertsForCoreAddress() (gas: 29171177)
L2GovernanceFactoryTest:testUpgraderCanCancel() (gas: 29462025)
L2SecurityCouncilMgmtFactoryTest:testMemberElectionGovDeployment() (gas: 30767668)
L2SecurityCouncilMgmtFactoryTest:testNomineeElectionGovDeployment() (gas: 30771899)
L2SecurityCouncilMgmtFactoryTest:testOnlyOwnerCanDeploy() (gas: 25781453)
L2SecurityCouncilMgmtFactoryTest:testRemovalGovDeployment() (gas: 30769899)
L2SecurityCouncilMgmtFactoryTest:testSecurityCouncilManagerDeployment() (gas: 30788992)
NomineeGovernorV2UpgradeActionTest:testAction() (gas: 8153)
OfficeHoursActionTest:testConstructor() (gas: 9050)
OfficeHoursActionTest:testFuzzOfficeHoursDeployment(uint256,uint256,int256,uint256,uint256,uint256) (runs: 257, μ: 317092, ~: 317184)
OfficeHoursActionTest:testFuzzOfficeHoursDeployment(uint256,uint256,int256,uint256,uint256,uint256) (runs: 256, μ: 317091, ~: 317184)
OfficeHoursActionTest:testInvalidConstructorParameters() (gas: 235740)
OfficeHoursActionTest:testPerformBeforeMinimumTimestamp() (gas: 8646)
OfficeHoursActionTest:testPerformDuringOfficeHours() (gas: 9140)
Expand Down Expand Up @@ -166,7 +168,7 @@ SecurityCouncilMemberElectionGovernorTest:testOnlyNomineeElectionGovernorCanProp
SecurityCouncilMemberElectionGovernorTest:testProperInitialization() (gas: 49388)
SecurityCouncilMemberElectionGovernorTest:testProposeReverts() (gas: 32916)
SecurityCouncilMemberElectionGovernorTest:testRelay() (gas: 42229)
SecurityCouncilMemberElectionGovernorTest:testSelectTopNominees(uint256) (runs: 257, μ: 339713, ~: 339475)
SecurityCouncilMemberElectionGovernorTest:testSelectTopNominees(uint256) (runs: 256, μ: 339688, ~: 339471)
SecurityCouncilMemberElectionGovernorTest:testSelectTopNomineesFails() (gas: 273335)
SecurityCouncilMemberElectionGovernorTest:testSetFullWeightDuration() (gas: 34951)
SecurityCouncilMemberElectionGovernorTest:testVotesToWeight() (gas: 152898)
Expand Down Expand Up @@ -218,7 +220,7 @@ SecurityCouncilNomineeElectionGovernorTest:testSetNomineeVetter() (gas: 39905)
SequencerActionsTest:testAddAndRemoveSequencer() (gas: 486652)
SequencerActionsTest:testCantAddZeroAddress() (gas: 235659)
SetInitialGovParamsActionTest:testL1() (gas: 259949)
SetInitialGovParamsActionTest:testL2() (gas: 688933)
SetInitialGovParamsActionTest:testL2() (gas: 688895)
SetSequencerInboxMaxTimeVariationActionTest:testSetMaxTimeVariation() (gas: 310296)
SwitchManagerRolesActionTest:testAction() (gas: 6313)
TokenDistributorTest:testClaim() (gas: 6086841)
Expand Down
69 changes: 66 additions & 3 deletions src/L2ArbitrumGovernor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import
"@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {L2ArbitrumToken} from "./L2ArbitrumToken.sol";

/// @title L2ArbitrumGovernor
/// @notice Governance controls for the Arbitrum DAO
Expand Down Expand Up @@ -41,6 +42,15 @@ contract L2ArbitrumGovernor is
/// Note that Excluded Address is a readable name with no code of PK associated with it, and thus can't vote.
address public constant EXCLUDE_ADDRESS = address(0xA4b86);

/// @notice Maximum quorum allowed for a proposal
/// @dev Since the setting is not checkpointed, it is possible that an existing proposal
/// with quorum greater than the maximum can have its quorum suddenly jump to equal maximumQuorum
uint256 public maximumQuorum;
/// @notice Minimum quorum allowed for a proposal
/// @dev Since the setting is not checkpointed, it is possible that an existing proposal
/// with quorum lesser than the minimum can have its quorum suddenly jump to equal minimumQuorum
uint256 public minimumQuorum;

constructor() {
_disableInitializers();
}
Expand Down Expand Up @@ -121,21 +131,74 @@ contract L2ArbitrumGovernor is
return address(this);
}

/// @notice Set the quorum minimum and maximum
/// @dev Since the setting is not checkpointed, it is possible that an existing proposal
/// with quorum outside the new min/max can have its quorum suddenly jump to equal
/// the new min or max
function setQuorumMinAndMax(uint256 _minimumQuorum, uint256 _maximumQuorum)
external
onlyGovernance
{
require(_minimumQuorum < _maximumQuorum, "L2ArbitrumGovernor: MIN_GT_MAX");
minimumQuorum = _minimumQuorum;
maximumQuorum = _maximumQuorum;
}

/// @notice Get "circulating" votes supply; i.e., total minus excluded vote exclude address.
function getPastCirculatingSupply(uint256 blockNumber) public view virtual returns (uint256) {
return
token.getPastTotalSupply(blockNumber) - token.getPastVotes(EXCLUDE_ADDRESS, blockNumber);
}

/// @notice Get total delegated votes minus excluded votes
/// @dev If the block number is prior to the first total delegation checkpoint, returns 0
/// Can also return 0 if excluded > total delegation, which is extremely unlikely but possible
/// since L2ArbitrumToken.getTotalDelegationAt is initially an estimate
function getPastTotalDelegatedVotes(uint256 blockNumber) public view returns (uint256) {
uint256 totalDvp = L2ArbitrumToken(address(token)).getTotalDelegationAt(blockNumber);

// getTotalDelegationAt may return 0 if the requested block is before the first checkpoint
if (totalDvp == 0) {
return 0;
}

uint256 excluded = token.getPastVotes(EXCLUDE_ADDRESS, blockNumber);

// it is possible (but unlikely) that excluded > totalDvp
// this is because getTotalDelegationAt is initially an _estimate_ of the total delegation
return totalDvp > excluded ? totalDvp - excluded : 0;
}

/// @notice Calculates the quorum size, excludes token delegated to the exclude address
/// @dev The calculated quorum is clamped between minimumQuorum and maximumQuorum
function quorum(uint256 blockNumber)
public
view
override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable)
returns (uint256)
{
return (getPastCirculatingSupply(blockNumber) * quorumNumerator(blockNumber))
/ quorumDenominator();
uint256 pastTotalDelegatedVotes = getPastTotalDelegatedVotes(blockNumber);

// if pastTotalDelegatedVotes is 0, then blockNumber is almost certainly prior to the first totalDelegatedVotes checkpoint
// in this case we should use getPastCirculatingSupply to ensure quorum of pre-existing proposals is unchanged
// in the unlikely event that totalDvp is 0 for a block _after_ the dvp update, getPastCirculatingSupply will be used with a larger quorumNumerator,
// resulting in a much higher calculated quorum. This is okay because quorum is clamped.
uint256 calculatedQuorum = (
(
pastTotalDelegatedVotes == 0
? getPastCirculatingSupply(blockNumber)
: pastTotalDelegatedVotes
) * quorumNumerator(blockNumber)
) / quorumDenominator();

// clamp the calculated quorum between minimumQuorum and maximumQuorum
if (calculatedQuorum < minimumQuorum) {
return minimumQuorum;
} else if (calculatedQuorum > maximumQuorum) {
return maximumQuorum;
} else {
return calculatedQuorum;
}
}

/// @inheritdoc GovernorVotesQuorumFractionUpgradeable
Expand Down Expand Up @@ -235,5 +298,5 @@ contract L2ArbitrumGovernor is
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
uint256[48] private __gap;
}
Loading
Loading