diff --git a/.gitignore b/.gitignore index 8180f988..4be16d13 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ packages/subgraph/imported packages/subgraph/generated packages/subgraph/tests/.bin +docs + # files *.env *.log diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 1f7e130f..c01ed907 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -20,6 +20,7 @@ import { import type {NetworkUserConfig} from 'hardhat/types'; import {resolve} from 'path'; import 'solidity-coverage'; +import 'solidity-docgen'; const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || '../../.env'; dotenvConfig({path: resolve(__dirname, dotenvConfigPath), override: true}); @@ -178,6 +179,13 @@ const config: HardhatUserConfig = { outDir: 'typechain', target: 'ethers-v5', }, + docgen: { + outputDir: 'docs', + theme: 'markdown', + pages: 'files', + collapseNewlines: true, + exclude: ['test', 'mocks'], + }, }; export default config; diff --git a/packages/contracts/package.json b/packages/contracts/package.json index a70f99c5..dd0d4e7c 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -8,6 +8,7 @@ "lint:sol": "cd ../../ && yarn run lint:contracts:sol", "lint:ts": "cd ../../ && yarn run lint:contracts:ts", "test": "hardhat test", + "docgen": "hardhat docgen", "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain", "clean": "rimraf ./artifacts ./cache ./coverage ./typechain ./types ./coverage.json && yarn typechain" }, @@ -38,11 +39,12 @@ "@types/chai": "^4.3.4", "@types/mocha": "^10.0.0", "@types/node": "^18.11.9", + "solidity-docgen": "^0.6.0-beta.36", "chai": "^4.3.7", "cross-env": "^7.0.3", "dotenv": "^16.3.1", "ethers": "5.7.2", - "hardhat": "^2.13.1", + "hardhat": "^2.22.15", "hardhat-deploy": "^0.11.26", "hardhat-gas-reporter": "^1.0.9", "ipfs-http-client": "^51.0.0", diff --git a/packages/contracts/src/ERC20/governance/GovernanceWrappedERC20.sol b/packages/contracts/src/ERC20/governance/GovernanceWrappedERC20.sol index f22b603b..3a5e8be4 100644 --- a/packages/contracts/src/ERC20/governance/GovernanceWrappedERC20.sol +++ b/packages/contracts/src/ERC20/governance/GovernanceWrappedERC20.sol @@ -31,7 +31,7 @@ import {IGovernanceWrappedERC20} from "./IGovernanceWrappedERC20.sol"; /// `withdrawFor`, which burns the wrapped [ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens and /// safely transfers the underlying tokens back to the owner. /// @dev This contract intentionally has no public mint functionality because this is the -/// responsibility of the underlying [ERC-20](https://eips.ethereum.org/EIPS/eip-20) token contract. +/// responsibility of the underlying [ERC-20](https://eips.ethereum.org/EIPS/eip-20) token contract. /// @custom:security-contact sirt@aragon.org contract GovernanceWrappedERC20 is IGovernanceWrappedERC20, diff --git a/packages/contracts/src/ERC20/governance/IGovernanceWrappedERC20.sol b/packages/contracts/src/ERC20/governance/IGovernanceWrappedERC20.sol index d4826251..6545f1e9 100644 --- a/packages/contracts/src/ERC20/governance/IGovernanceWrappedERC20.sol +++ b/packages/contracts/src/ERC20/governance/IGovernanceWrappedERC20.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.8; /// @title IGovernanceWrappedERC20 /// @author Aragon X /// @notice An interface for the token wrapping contract wrapping existing -/// [ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens. +/// [ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens. /// @custom:security-contact sirt@aragon.org interface IGovernanceWrappedERC20 { /// @notice Deposits an amount of underlying token diff --git a/packages/contracts/src/IMajorityVoting.sol b/packages/contracts/src/IMajorityVoting.sol index f3e73834..8f2e8e0c 100644 --- a/packages/contracts/src/IMajorityVoting.sol +++ b/packages/contracts/src/IMajorityVoting.sol @@ -3,13 +3,13 @@ pragma solidity ^0.8.8; /// @title IMajorityVoting -/// @author Aragon X - 2022-2023 +/// @author Aragon X - 2022-2024 /// @notice The interface of majority voting plugin. /// @custom:security-contact sirt@aragon.org interface IMajorityVoting { /// @notice Vote options that a voter can chose from. /// @param None The default option state of a voter indicating the absence from the vote. - /// This option neither influences support nor participation. + /// This option neither influences support nor participation. /// @param Abstain This option does not influence the support but counts towards participation. /// @param Yes This option increases the support and counts towards participation. /// @param No This option decreases the support and counts towards participation. @@ -36,7 +36,7 @@ interface IMajorityVoting { /// @return The support threshold parameter. function supportThreshold() external view returns (uint32); - /// @notice Returns the min approval value stored configured. + /// @notice Returns the configured minimum approval value. /// @return The minimal approval value. function minApproval() external view returns (uint256); @@ -45,43 +45,43 @@ interface IMajorityVoting { function minParticipation() external view returns (uint32); /// @notice Checks if the support value defined as: - /// $$\texttt{support} = \frac{N_\text{yes}}{N_\text{yes}+N_\text{no}}$$ - /// for a proposal vote is greater than the support threshold. + /// $$\texttt{support} = \frac{N_\text{yes}}{N_\text{yes}+N_\text{no}}$$ + /// for a proposal is greater than the support threshold. /// @param _proposalId The ID of the proposal. /// @return Returns `true` if the support is greater than the support threshold and `false` otherwise. function isSupportThresholdReached(uint256 _proposalId) external view returns (bool); /// @notice Checks if the worst-case support value defined as: - /// $$\texttt{worstCaseSupport} = \frac{N_\text{yes}}{ N_\text{total}-N_\text{abstain}}$$ - /// for a proposal vote is greater than the support threshold. + /// $$\texttt{worstCaseSupport} = \frac{N_\text{yes}}{ N_\text{total}-N_\text{abstain}}$$ + /// for a proposal is greater than the support threshold. /// @param _proposalId The ID of the proposal. /// @return Returns `true` if the worst-case support is greater than the support threshold and `false` otherwise. function isSupportThresholdReachedEarly(uint256 _proposalId) external view returns (bool); /// @notice Checks if the participation value defined as: - /// $$\texttt{participation} = \frac{N_\text{yes}+N_\text{no}+N_\text{abstain}}{N_\text{total}}$$ - /// for a proposal vote is greater or equal than the minimum participation value. + /// $$\texttt{participation} = \frac{N_\text{yes}+N_\text{no}+N_\text{abstain}}{N_\text{total}}$$ + /// for a proposal is greater or equal than the minimum participation value. /// @param _proposalId The ID of the proposal. - /// @return Returns `true` if the participation is greater than the minimum participation and `false` otherwise. + /// @return Returns `true` if the participation is greater or equal than the minimum participation, + /// and `false` otherwise. function isMinParticipationReached(uint256 _proposalId) external view returns (bool); /// @notice Checks if the min approval value defined as: - ///$$\texttt{minApproval} = \frac{N_\text{yes}}{N_\text{total}}$$ - /// for a proposal vote is greater or equal than the minimum approval value. + /// $$\texttt{minApproval} = \frac{N_\text{yes}}{N_\text{total}}$$ + /// for a proposal is greater or equal than the minimum approval value. /// @param _proposalId The ID of the proposal. - /// @return Returns `true` if the participation is greater than the minimum participation and `false` otherwise. + /// @return Returns `true` if the approvals is greater or equal than the minimum approval and `false` otherwise. function isMinApprovalReached(uint256 _proposalId) external view returns (bool); - /// @notice Checks if an account can participate on a proposal vote. This can be because the vote + /// @notice Checks if an account can participate on a proposal. This can be because the vote /// - has not started, /// - has ended, /// - was executed, or /// - the voter doesn't have voting powers. /// @param _proposalId The proposal Id. /// @param _account The account address to be checked. - /// @param _voteOption Whether the voter abstains, supports or opposes the proposal. + /// @param _voteOption Whether the voter abstains, supports or opposes the proposal. /// @return Returns true if the account is allowed to vote. - /// @dev The function assumes the queried proposal exists. function canVote( uint256 _proposalId, address _account, @@ -93,12 +93,12 @@ interface IMajorityVoting { /// @return True if the proposal can be executed, false otherwise. function canExecute(uint256 _proposalId) external view returns (bool); - /// @notice Votes for a vote option and, optionally, executes the proposal. + /// @notice Votes on a proposal and, optionally, executes the proposal. /// @dev `_voteOption`, 1 -> abstain, 2 -> yes, 3 -> no /// @param _proposalId The ID of the proposal. /// @param _voteOption The chosen vote option. /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. - /// The call does not revert if early execution is not possible. + /// The call does not revert if early execution is not possible. function vote(uint256 _proposalId, VoteOption _voteOption, bool _tryEarlyExecution) external; /// @notice Executes a proposal. @@ -106,7 +106,8 @@ interface IMajorityVoting { function execute(uint256 _proposalId) external; /// @notice Returns whether the account has voted for the proposal. - /// Note, that this does not check if the account has voting power. + /// @dev May return `none` if the `_proposalId` does not exist, + /// or the `_account` does not have voting power. /// @param _proposalId The ID of the proposal. /// @param _account The account address to be checked. /// @return The vote option cast by a voter for a certain proposal. diff --git a/packages/contracts/src/MajorityVotingBase.sol b/packages/contracts/src/MajorityVotingBase.sol index 1c31e297..ae17d720 100644 --- a/packages/contracts/src/MajorityVotingBase.sol +++ b/packages/contracts/src/MajorityVotingBase.sol @@ -21,7 +21,7 @@ import {IMajorityVoting} from "./IMajorityVoting.sol"; /* solhint-enable max-line-length */ /// @title MajorityVotingBase -/// @author Aragon X - 2022-2023 +/// @author Aragon X - 2022-2024 /// @notice The abstract implementation of majority voting plugins. /// /// ### Parameterization @@ -116,7 +116,7 @@ import {IMajorityVoting} from "./IMajorityVoting.sol"; /// $$ /// /// Accordingly, early execution is possible when the vote is open, -/// the modified support criterion, and the particicpation criterion are met. +/// the modified support criterion, and the particicpation criterion are met. /// @dev This contract implements the `IMajorityVoting` interface. /// @custom:security-contact sirt@aragon.org abstract contract MajorityVotingBase is @@ -132,9 +132,9 @@ abstract contract MajorityVotingBase is /// @notice The different voting modes available. /// @param Standard In standard mode, early execution and vote replacement are disabled. /// @param EarlyExecution In early execution mode, a proposal can be executed - /// early before the end date if the vote outcome cannot mathematically change by more voters voting. + /// early before the end date if the vote outcome cannot mathematically change by more voters voting. /// @param VoteReplacement In vote replacement mode, voters can change their vote - /// multiple times and only the latest vote option is tallied. + /// multiple times and only the latest vote option is tallied. enum VotingMode { Standard, EarlyExecution, @@ -143,15 +143,15 @@ abstract contract MajorityVotingBase is /// @notice A container for the majority voting settings that will be applied as parameters on proposal creation. /// @param votingMode A parameter to select the vote mode. - /// In standard mode (0), early execution and vote replacement are disabled. - /// In early execution mode (1), a proposal can be executed early before the end date - /// if the vote outcome cannot mathematically change by more voters voting. - /// In vote replacement mode (2), voters can change their vote multiple times - /// and only the latest vote option is tallied. + /// In standard mode (0), early execution and vote replacement are disabled. + /// In early execution mode (1), a proposal can be executed early before the end date + /// if the vote outcome cannot mathematically change by more voters voting. + /// In vote replacement mode (2), voters can change their vote multiple times + /// and only the latest vote option is tallied. /// @param supportThreshold The support threshold value. - /// Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. + /// Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. /// @param minParticipation The minimum participation value. - /// Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. + /// Its value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. /// @param minDuration The minimum duration of the proposal vote in seconds. /// @param minProposerVotingPower The minimum voting power required to create a proposal. struct VotingSettings { @@ -169,9 +169,12 @@ abstract contract MajorityVotingBase is /// @param voters The votes casted by the voters. /// @param actions The actions to be executed when the proposal passes. /// @param allowFailureMap A bitmap allowing the proposal to succeed, even if individual actions might revert. + /// If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. + /// A failure map value of 0 requires every action to not revert. /// @param minApprovalPower The minimum amount of yes votes power needed for the proposal advance. - /// If the bit at index `i` is 1, the proposal succeeds even if the `i`th action reverts. - /// A failure map value of 0 requires every action to not revert. + /// @param targetConfig Configuration for the execution target, specifying the target address and operation type + /// (either `Call` or `DelegateCall`). Defined by `TargetConfig` in the `IPlugin` interface, + /// part of the `osx-commons-contracts` package, added in build 3. struct Proposal { bool executed; ProposalParameters parameters; @@ -186,11 +189,11 @@ abstract contract MajorityVotingBase is /// @notice A container for the proposal parameters at the time of proposal creation. /// @param votingMode A parameter to select the vote mode. /// @param supportThreshold The support threshold value. - /// The value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. + /// The value has to be in the interval [0, 10^6] defined by `RATIO_BASE = 10**6`. /// @param startDate The start date of the proposal vote. /// @param endDate The end date of the proposal vote. /// @param snapshotBlock The number of the block prior to the proposal creation. - /// @param minVotingPower The minimum voting power needed. + /// @param minVotingPower The minimum voting power needed for a proposal to reach minimum participation. struct ProposalParameters { VotingMode votingMode; uint32 supportThreshold; @@ -243,8 +246,8 @@ abstract contract MajorityVotingBase is /// @notice The struct storing the voting settings. VotingSettings private votingSettings; - /// @notice The minimal ratio of yes votes needed for a proposal succeed. - /// @dev is not on the VotingSettings for compatibility reasons. + /// @notice The minimum ratio of yes votes needed for a proposal to succeed. + /// @dev Not included in VotingSettings for compatibility reasons. uint256 private minApprovals; // added in v1.3 /// @notice Thrown if a date is out of bounds. @@ -305,6 +308,12 @@ abstract contract MajorityVotingBase is /// @dev This method is required to support [ERC-1822](https://eips.ethereum.org/EIPS/eip-1822). /// @param _dao The IDAO interface of the associated DAO. /// @param _votingSettings The voting settings. + /// @param _targetConfig Configuration for the execution target, specifying the target address and operation type + /// (either `Call` or `DelegateCall`). Defined by `TargetConfig` in the `IPlugin` interface, + /// part of the `osx-commons-contracts` package, added in build 3. + /// @param _minApprovals The minimal amount of approvals the proposal needs to succeed. + /// @param _pluginMetadata The plugin specific information encoded in bytes. + /// This can also be an ipfs cid encoded in bytes. // solhint-disable-next-line func-name-mixedcase function __MajorityVotingBase_init( IDAO _dao, @@ -370,6 +379,7 @@ abstract contract MajorityVotingBase is } /// @inheritdoc IProposal + /// @dev Requires the `EXECUTE_PROPOSAL_PERMISSION_ID` permission. function execute( uint256 _proposalId ) public virtual override(IMajorityVoting, IProposal) auth(EXECUTE_PROPOSAL_PERMISSION_ID) { @@ -388,6 +398,7 @@ abstract contract MajorityVotingBase is } /// @inheritdoc IMajorityVoting + /// @dev Reverts if the proposal with the given `_proposalId` does not exist. function canVote( uint256 _proposalId, address _voter, @@ -401,6 +412,7 @@ abstract contract MajorityVotingBase is } /// @inheritdoc IMajorityVoting + /// @dev Reverts if the proposal with the given `_proposalId` does not exist. function canExecute( uint256 _proposalId ) public view virtual override(IMajorityVoting, IProposal) returns (bool) { @@ -412,6 +424,7 @@ abstract contract MajorityVotingBase is } /// @inheritdoc IProposal + /// @dev Reverts if the proposal with the given `_proposalId` does not exist. function hasSucceeded(uint256 _proposalId) public view virtual returns (bool) { if (!_proposalExists(_proposalId)) { revert NonexistentProposal(_proposalId); @@ -504,12 +517,12 @@ abstract contract MajorityVotingBase is /// @return The total voting power. function totalVotingPower(uint256 _blockNumber) public view virtual returns (uint256); - /// @notice Returns all information for a proposal vote by its ID. + /// @notice Returns all information for a proposal by its ID. /// @param _proposalId The ID of the proposal. /// @return open Whether the proposal is open or not. /// @return executed Whether the proposal is executed or not. - /// @return parameters The parameters of the proposal vote. - /// @return tally The current tally of the proposal vote. + /// @return parameters The parameters of the proposal. + /// @return tally The current tally of the proposal. /// @return actions The actions to be executed in the associated DAO after the proposal has passed. /// @return allowFailureMap The bit map representations of which actions are allowed to revert so tx still succeeds. function getProposal( @@ -538,6 +551,7 @@ abstract contract MajorityVotingBase is } /// @notice Updates the voting settings. + /// @dev Requires the `UPDATE_VOTING_SETTINGS_PERMISSION_ID` permission. /// @param _votingSettings The new voting settings. function updateVotingSettings( VotingSettings calldata _votingSettings @@ -546,6 +560,7 @@ abstract contract MajorityVotingBase is } /// @notice Updates the minimal approval value. + /// @dev Requires the `UPDATE_VOTING_SETTINGS_PERMISSION_ID` permission. /// @param _minApprovals The new minimal approval value. function updateMinApprovals( uint256 _minApprovals @@ -557,16 +572,16 @@ abstract contract MajorityVotingBase is /// @param _metadata The metadata of the proposal. /// @param _actions The actions that will be executed after the proposal passes. /// @param _allowFailureMap Allows proposal to succeed even if an action reverts. - /// Uses bitmap representation. - /// If the bit at index `x` is 1, the tx succeeds even if the action at `x` failed. - /// Passing 0 will be treated as atomic execution. + /// Uses bitmap representation. + /// If the bit at index `x` is 1, the tx succeeds even if the action at `x` failed. + /// Passing 0 will be treated as atomic execution. /// @param _startDate The start date of the proposal vote. - /// If 0, the current timestamp is used and the vote starts immediately. + /// If 0, the current timestamp is used and the vote starts immediately. /// @param _endDate The end date of the proposal vote. - /// If 0, `_startDate + minDuration` is used. + /// If 0, `_startDate + minDuration` is used. /// @param _voteOption The chosen vote option to be casted on proposal creation. /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. - /// The call does not revert if early execution is not possible. + /// The call does not revert if early execution is not possible. /// @return proposalId The ID of the proposal. function createProposal( bytes calldata _metadata, @@ -578,11 +593,11 @@ abstract contract MajorityVotingBase is bool _tryEarlyExecution ) external virtual returns (uint256 proposalId); - /// @notice Internal function to cast a vote. It assumes the queried vote exists. + /// @notice Internal function to cast a vote. It assumes the queried proposal exists. /// @param _proposalId The ID of the proposal. /// @param _voteOption The chosen vote option to be casted on the proposal vote. /// @param _tryEarlyExecution If `true`, early execution is tried after the vote cast. - /// The call does not revert if early execution is not possible. + /// The call does not revert if early execution is not possible. function _vote( uint256 _proposalId, VoteOption _voteOption, @@ -590,7 +605,7 @@ abstract contract MajorityVotingBase is bool _tryEarlyExecution ) internal virtual; - /// @notice Internal function to execute a vote. It assumes the queried proposal exists. + /// @notice Internal function to execute a proposal. It assumes the queried proposal exists. /// @param _proposalId The ID of the proposal. function _execute(uint256 _proposalId) internal virtual { Proposal storage proposal_ = proposals[_proposalId]; @@ -650,9 +665,9 @@ abstract contract MajorityVotingBase is } /// @notice Internal function to check if a proposal can be executed. It assumes the queried proposal exists. + /// @dev Threshold and minimal values are compared with `>` and `>=` comparators, respectively. /// @param _proposalId The ID of the proposal. /// @return True if the proposal can be executed, false otherwise. - /// @dev Threshold and minimal values are compared with `>` and `>=` comparators, respectively. function _canExecute(uint256 _proposalId) internal view virtual returns (bool) { Proposal storage proposal_ = proposals[_proposalId]; @@ -664,9 +679,9 @@ abstract contract MajorityVotingBase is return _hasSucceeded(_proposalId); } - /// @notice Internal function to check if a proposal vote is still open. + /// @notice Internal function to check if a proposal is still open. /// @param proposal_ The proposal struct. - /// @return True if the proposal vote is open, false otherwise. + /// @return True if the proposal is open, false otherwise. function _isProposalOpen(Proposal storage proposal_) internal view virtual returns (bool) { uint64 currentTime = block.timestamp.toUint64(); @@ -676,7 +691,7 @@ abstract contract MajorityVotingBase is !proposal_.executed; } - /// @notice Internal function to update the plugin-wide proposal vote settings. + /// @notice Internal function to update the plugin-wide proposal settings. /// @param _votingSettings The voting settings to be validated and updated. function _updateVotingSettings(VotingSettings calldata _votingSettings) internal virtual { // Require the support threshold value to be in the interval [0, 10^6-1], @@ -733,12 +748,12 @@ abstract contract MajorityVotingBase is emit VotingMinApprovalUpdated(_minApprovals); } - /// @notice Validates and returns the proposal vote dates. - /// @param _start The start date of the proposal vote. - /// If 0, the current timestamp is used and the vote starts immediately. - /// @param _end The end date of the proposal vote. If 0, `_start + minDuration` is used. - /// @return startDate The validated start date of the proposal vote. - /// @return endDate The validated end date of the proposal vote. + /// @notice Validates and returns the proposal dates. + /// @param _start The start date of the proposal. + /// If 0, the current timestamp is used and the vote starts immediately. + /// @param _end The end date of the proposal. If 0, `_start + minDuration` is used. + /// @return startDate The validated start date of the proposal. + /// @return endDate The validated end date of the proposal. function _validateProposalDates( uint64 _start, uint64 _end diff --git a/packages/contracts/src/TokenVoting.sol b/packages/contracts/src/TokenVoting.sol index 8b572335..41b2e0e0 100644 --- a/packages/contracts/src/TokenVoting.sol +++ b/packages/contracts/src/TokenVoting.sol @@ -16,10 +16,10 @@ import {Action} from "@aragon/osx-commons-contracts/src/executors/IExecutor.sol" import {MajorityVotingBase} from "./MajorityVotingBase.sol"; /// @title TokenVoting -/// @author Aragon X - 2021-2023 +/// @author Aragon X - 2021-2024 /// @notice The majority voting implementation using an -/// [OpenZeppelin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) -/// compatible governance token. +/// [OpenZeppelin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) +/// compatible governance token. /// @dev v1.3 (Release 1, Build 3). For each upgrade, if the reinitialization step is required, /// increment the version numbers in the modifier for both the initialize and initializeFrom functions. /// @custom:security-contact sirt@aragon.org @@ -30,7 +30,7 @@ contract TokenVoting is IMembership, MajorityVotingBase { bytes4 internal constant TOKEN_VOTING_INTERFACE_ID = this.getVotingToken.selector; /// @notice An [OpenZeppelin `Votes`](https://docs.openzeppelin.com/contracts/4.x/api/governance#Votes) - /// compatible contract referencing the token being used for voting. + /// compatible contract referencing the token being used for voting. IVotesUpgradeable private votingToken; /// @notice Thrown if the voting power is zero @@ -41,7 +41,12 @@ contract TokenVoting is IMembership, MajorityVotingBase { /// @param _dao The IDAO interface of the associated DAO. /// @param _votingSettings The voting settings. /// @param _token The [ERC-20](https://eips.ethereum.org/EIPS/eip-20) token used for voting. + /// @param _targetConfig Configuration for the execution target, specifying the target address and operation type + /// (either `Call` or `DelegateCall`). Defined by `TargetConfig` in the `IPlugin` interface, + /// part of the `osx-commons-contracts` package, added in build 3. /// @param _minApprovals The minimal amount of approvals the proposal needs to succeed. + /// @param _pluginMetadata The plugin specific information encoded in bytes. + /// This can also be an ipfs cid encoded in bytes. function initialize( IDAO _dao, VotingSettings calldata _votingSettings, @@ -63,14 +68,14 @@ contract TokenVoting is IMembership, MajorityVotingBase { emit MembershipContractAnnounced({definingContract: address(_token)}); } - /// @notice Reinitializes the TokenVoting after an upgrade from a previous protocol version. For each + /// @notice Reinitializes the TokenVoting after an upgrade from a previous build version. For each /// reinitialization step, use the `_fromBuild` version to decide which internal functions to /// call for reinitialization. /// @dev WARNING: The contract should only be upgradeable through PSP to ensure that _fromBuild is not - /// incorrectly passed, and that the appropriate permissions for the upgrade are properly configured. + /// incorrectly passed, and that the appropriate permissions for the upgrade are properly configured. /// @param _fromBuild Build version number of previous implementation contract this upgrade is transitioning from. /// @param _initData The initialization data to be passed to via `upgradeToAndCall` - /// (see [ERC-1967](https://docs.openzeppelin.com/contracts/4.x/api/proxy#ERC1967Upgrade)). + /// (see [ERC-1967](https://docs.openzeppelin.com/contracts/4.x/api/proxy#ERC1967Upgrade)). function initializeFrom(uint16 _fromBuild, bytes calldata _initData) external reinitializer(2) { if (_fromBuild < 3) { ( @@ -99,7 +104,7 @@ contract TokenVoting is IMembership, MajorityVotingBase { /// @notice getter function for the voting token. /// @dev public function also useful for registering interfaceId - /// and for distinguishing from majority voting interface. + /// and for distinguishing from majority voting interface. /// @return The token used for voting. function getVotingToken() public view returns (IVotesUpgradeable) { return votingToken; @@ -111,6 +116,7 @@ contract TokenVoting is IMembership, MajorityVotingBase { } /// @inheritdoc MajorityVotingBase + /// @dev Requires the `CREATE_PROPOSAL_PERMISSION_ID` permission. function createProposal( bytes calldata _metadata, Action[] calldata _actions, diff --git a/packages/contracts/src/TokenVotingSetup.sol b/packages/contracts/src/TokenVotingSetup.sol index e3952086..58b1c656 100644 --- a/packages/contracts/src/TokenVotingSetup.sol +++ b/packages/contracts/src/TokenVotingSetup.sol @@ -25,7 +25,7 @@ import {ProxyLib} from "@aragon/osx-commons-contracts/src/utils/deployment/Proxy import {VotingPowerCondition} from "./VotingPowerCondition.sol"; /// @title TokenVotingSetup -/// @author Aragon X - 2022-2023 +/// @author Aragon X - 2022-2024 /// @notice The setup contract of the `TokenVoting` plugin. /// @dev v1.3 (Release 1, Build 3) /// @custom:security-contact sirt@aragon.org @@ -36,7 +36,6 @@ contract TokenVotingSetup is PluginUpgradeableSetup { using ProxyLib for address; /// @notice The identifier of the `EXECUTE_PERMISSION` permission. - /// @dev TODO: Migrate this constant to a common library that can be shared across plugins. bytes32 public constant EXECUTE_PERMISSION_ID = keccak256("EXECUTE_PERMISSION"); /// @notice The ID of the permission required to call the `setTargetConfig` function. @@ -68,18 +67,19 @@ contract TokenVotingSetup is PluginUpgradeableSetup { // solhint-disable-next-line immutable-vars-naming address public immutable governanceWrappedERC20Base; - /// @notice The token settings struct. - /// @param addr The token address. If this is `address(0)`, a new `GovernanceERC20` token is deployed. - /// If not, the existing token is wrapped as an `GovernanceWrappedERC20`. - /// @param name The token name. This parameter is only relevant if the token address is `address(0)`. - /// @param symbol The token symbol. This parameter is only relevant if the token address is `address(0)`. + /// @notice Configuration settings for a token used within the governance system. + /// @param addr The token address. If set to `address(0)`, a new `GovernanceERC20` token is deployed. + /// If the address implements `IVotes`, it will be used directly; otherwise, + /// it is wrapped as `GovernanceWrappedERC20`. + /// @param name The name of the token, relevant only if a new token is deployed (i.e., `addr` is `address(0)`). + /// @param symbol The symbol of the token, relevant only if a new token is deployed (i.e., `addr` is `address(0)`). struct TokenSettings { address addr; string name; string symbol; } - /// @notice Thrown if token address is passed which is not a token. + /// @notice Thrown if the passed token address is not a token contract. /// @param token The token address error TokenNotContract(address token); @@ -88,7 +88,7 @@ contract TokenVotingSetup is PluginUpgradeableSetup { error TokenNotERC20(address token); /// @notice The contract constructor deploying the plugin implementation contract - /// and receiving the governance token base contracts to clone from. + /// and receiving the governance token base contracts to clone from. /// @param _governanceERC20Base The base `GovernanceERC20` contract to create clones from. /// @param _governanceWrappedERC20Base The base `GovernanceWrappedERC20` contract to create clones from. constructor( diff --git a/packages/contracts/src/VotingPowerCondition.sol b/packages/contracts/src/VotingPowerCondition.sol index 7f23c387..316af97b 100644 --- a/packages/contracts/src/VotingPowerCondition.sol +++ b/packages/contracts/src/VotingPowerCondition.sol @@ -7,17 +7,31 @@ import {TokenVoting} from "./TokenVoting.sol"; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import {IVotesUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol"; +import {IPermissionCondition} from "@aragon/osx-commons-contracts/src/permission/condition/IPermissionCondition.sol"; import {PermissionCondition} from "@aragon/osx-commons-contracts/src/permission/condition/PermissionCondition.sol"; +/// @title VotingPowerCondition +/// @author Aragon X - 2024 +/// @notice Checks if an account's voting power or token balance meets the threshold set +/// in an associated TokenVoting plugin. +/// @custom:security-contact sirt@aragon.org contract VotingPowerCondition is PermissionCondition { + /// @notice The address of the `TokenVoting` plugin used to fetch voting power settings. TokenVoting private immutable TOKEN_VOTING; + + /// @notice The `IVotesUpgradeable` token interface used to check token balance. IVotesUpgradeable private immutable VOTING_TOKEN; + /// @notice Initializes the contract with the `TokenVoting` plugin address and fetches the associated token. + /// @param _tokenVoting The address of the `TokenVoting` plugin. constructor(address _tokenVoting) { TOKEN_VOTING = TokenVoting(_tokenVoting); VOTING_TOKEN = TOKEN_VOTING.getVotingToken(); } + /// @inheritdoc IPermissionCondition + /// @dev The function checks both the voting power and token balance to ensure `_who` meets the minimum voting + /// threshold defined in the `TokenVoting` plugin. Returns `false` if the minimum requirement is unmet. function isGranted( address _where, address _who, diff --git a/packages/contracts/test/20_integration-testing/22_setup-processing.ts b/packages/contracts/test/20_integration-testing/22_setup-processing.ts index a87295c0..a9b2019a 100644 --- a/packages/contracts/test/20_integration-testing/22_setup-processing.ts +++ b/packages/contracts/test/20_integration-testing/22_setup-processing.ts @@ -1,5 +1,5 @@ import {METADATA, VERSION} from '../../plugin-settings'; -import {GovernanceERC20} from '../../typechain'; +import {GovernanceERC20, TokenVoting__factory} from '../../typechain'; import {MajorityVotingBase} from '../../typechain/src/MajorityVotingBase'; import {getProductionNetworkName, findPluginRepo} from '../../utils/helpers'; import { @@ -37,7 +37,6 @@ import { PluginSetupProcessorStructs, PluginSetupProcessor__factory, DAO, - TokenVoting__factory, } from '@aragon/osx-ethers'; import {BigNumber} from '@ethersproject/bignumber'; import {loadFixture} from '@nomicfoundation/hardhat-network-helpers'; diff --git a/packages/contracts/test/30_regression-testing/31_upgradeability.ts b/packages/contracts/test/30_regression-testing/31_upgradeability.ts index f90ba72d..3a38d7dc 100644 --- a/packages/contracts/test/30_regression-testing/31_upgradeability.ts +++ b/packages/contracts/test/30_regression-testing/31_upgradeability.ts @@ -1,5 +1,8 @@ import {createDaoProxy} from '../20_integration-testing/test-helpers'; -import {TestGovernanceERC20} from '../../typechain'; +import { + TestGovernanceERC20, + TestGovernanceERC20__factory, +} from '../../typechain'; import {MajorityVotingBase} from '../../typechain/src'; import { INITIALIZE_SIGNATURE, @@ -23,7 +26,7 @@ import { TIME, pctToRatio, } from '@aragon/osx-commons-sdk'; -import {DAO, TestGovernanceERC20__factory} from '@aragon/osx-ethers'; +import {DAO} from '@aragon/osx-ethers'; import {loadFixture} from '@nomicfoundation/hardhat-network-helpers'; import {SignerWithAddress} from '@nomiclabs/hardhat-ethers/signers'; import {expect} from 'chai'; @@ -96,6 +99,9 @@ describe('Upgrades', () => { ); throw new Error(''); } catch (err: any) { + if (err.data === undefined) { + throw err; + } expect(err.data).to.equal(AlreadyInitializedSignature); } @@ -192,6 +198,9 @@ describe('Upgrades', () => { ); throw new Error(''); } catch (err: any) { + if (err.data === undefined) { + throw err; + } expect(err.data).to.equal(AlreadyInitializedSignature); } data[8] = 'initializeFrom'; diff --git a/packages/contracts/yarn.lock b/packages/contracts/yarn.lock index b81afa7a..9f5945ec 100644 --- a/packages/contracts/yarn.lock +++ b/packages/contracts/yarn.lock @@ -663,33 +663,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz#ff2acb98a86b9290e35e315a6abfb9aebb9cf39e" - integrity sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-blockchain@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz#b77511b389290b186c8d999e70f4b15c27ef44ea" - integrity sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-ethash" "3.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" +"@nomicfoundation/edr-darwin-arm64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz#6eaa64a6ea5201e4c92b121f2b7fd197b26e450a" + integrity sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ== + +"@nomicfoundation/edr-darwin-x64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz#d15ca89e9deef7d0a710cf90e79f3cc270a5a999" + integrity sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz#e73c41ca015dfddb5f4cb6cd3d9b2cbe5cc28989" + integrity sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz#90906f733e4ad26657baeb22d28855d934ab7541" + integrity sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz#11b8bd73df145a192e5a08199e5e81995fcde502" + integrity sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA== + +"@nomicfoundation/edr-linux-x64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz#a34b9a2c9e34853207824dc81622668a069ca642" + integrity sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz#ca035c6f66ae9f88fa3ef123a1f3a2099cce7a5a" + integrity sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw== + +"@nomicfoundation/edr@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.4.tgz#1cd336c46a60f5af774e6cf0f1943f49f63dded6" + integrity sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.4" + "@nomicfoundation/edr-darwin-x64" "0.6.4" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.4" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-x64-musl" "0.6.4" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.4" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -698,62 +718,11 @@ dependencies: "@nomicfoundation/ethereumjs-util" "9.0.4" -"@nomicfoundation/ethereumjs-ethash@3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz#06cb2502b3012fb6c11cffd44af08aecf71310da" - integrity sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - bigint-crypto-utils "^3.2.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz#c9c761767283ac53946185474362230b169f8f63" - integrity sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/debug" "^4.1.9" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - rustbn-wasm "^0.2.0" - "@nomicfoundation/ethereumjs-rlp@5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== -"@nomicfoundation/ethereumjs-statemanager@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz#bf14415e1f31b5ea8b98a0c027c547d0555059b6" - integrity sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - js-sdsl "^4.1.4" - lru-cache "^10.0.0" - -"@nomicfoundation/ethereumjs-trie@6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz#688a3f76646c209365ee6d959c3d7330ede5e609" - integrity sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" - readable-stream "^3.6.0" - "@nomicfoundation/ethereumjs-tx@5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" @@ -772,33 +741,6 @@ "@nomicfoundation/ethereumjs-rlp" "5.0.4" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-verkle@0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz#7686689edec775b2efea5a71548f417c18f7dea4" - integrity sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - lru-cache "^10.0.0" - rust-verkle-wasm "^0.0.1" - -"@nomicfoundation/ethereumjs-vm@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz#e5a6eec4877dc62dda93003c6d7afd1fe4b9625b" - integrity sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - "@nomicfoundation/hardhat-chai-matchers@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" @@ -1067,7 +1009,7 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@scure/base@^1.1.1", "@scure/base@~1.1.0", "@scure/base@~1.1.4": +"@scure/base@~1.1.0", "@scure/base@~1.1.4": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== @@ -1381,13 +1323,6 @@ dependencies: "@types/node" "*" -"@types/debug@^4.1.9": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -1440,11 +1375,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - "@types/node@*", "@types/node@>=13.7.0": version "20.11.22" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.22.tgz#9a192c3d7e7e71fa3a4b15032654f64643815cd6" @@ -1491,14 +1421,6 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.12.tgz#afa96b383a3a6fdc859453a1892d41b607fc7756" integrity sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg== -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" - "@types/responselike@^1.0.0": version "1.0.3" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" @@ -1899,11 +1821,6 @@ big.js@^6.0.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== -bigint-crypto-utils@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" @@ -2334,7 +2251,7 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@^3.5.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -2349,6 +2266,13 @@ chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -2494,10 +2418,10 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== compare-versions@^6.0.0: version "6.1.0" @@ -2705,7 +2629,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3994,7 +3918,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -handlebars@^4.0.1: +handlebars@^4.0.1, handlebars@^4.7.7: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== @@ -4058,24 +3982,17 @@ hardhat-gas-reporter@^1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.13.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.20.1.tgz#3ad8f2b003a96c9ce80a55fec3575580ff2ddcd4" - integrity sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw== +hardhat@^2.22.15: + version "2.22.15" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.15.tgz#319b4948f875968fde3f0d09a7edfe74e16b1365" + integrity sha512-BpTGa9PE/sKAaHi4s/S1e9WGv63DR1m7Lzfd60C8gSEchDPfAJssVRSq0MZ2v2k76ig9m0kHAwVLf5teYwu/Mw== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" + "@nomicfoundation/edr" "^0.6.4" "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" - "@nomicfoundation/ethereumjs-verkle" "0.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.4" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" @@ -4085,7 +4002,7 @@ hardhat@^2.13.1: ansi-escapes "^4.3.0" boxen "^5.1.2" chalk "^2.4.2" - chokidar "^3.4.0" + chokidar "^4.0.0" ci-info "^2.0.0" debug "^4.1.1" enquirer "^2.3.0" @@ -4098,6 +4015,7 @@ hardhat@^2.13.1: glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + json-stream-stringify "^3.1.4" keccak "^3.0.2" lodash "^4.17.11" mnemonist "^0.38.0" @@ -4106,7 +4024,7 @@ hardhat@^2.13.1: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" @@ -4880,11 +4798,6 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== - js-sha3@0.5.7, js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -4935,6 +4848,11 @@ json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -5114,11 +5032,6 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== -lru-cache@^10.0.0, "lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -5126,6 +5039,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -6120,6 +6038,11 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -6218,7 +6141,7 @@ require-from-string@^1.1.0: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -6327,18 +6250,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rust-verkle-wasm@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz#fd8396a7060d8ee8ea10da50ab6e862948095a74" - integrity sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA== - -rustbn-wasm@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" - integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== - dependencies: - "@scure/base" "^1.1.1" - safe-array-concat@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" @@ -6625,18 +6536,16 @@ snake-case@^2.1.0: dependencies: no-case "^2.2.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -6651,6 +6560,11 @@ solc@^0.4.20: semver "^5.3.0" yargs "^4.7.1" +solidity-ast@^0.4.38: + version "0.4.59" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== + solidity-ast@^0.4.51: version "0.4.55" resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.55.tgz#00b685e6eefb2e8dfb67df1fe0afbe3b3bfb4b28" @@ -6683,6 +6597,14 @@ solidity-coverage@^0.8.2: shelljs "^0.8.3" web3-utils "^1.3.6" +solidity-docgen@^0.6.0-beta.36: + version "0.6.0-beta.36" + resolved "https://registry.yarnpkg.com/solidity-docgen/-/solidity-docgen-0.6.0-beta.36.tgz#9c76eda58580fb52e2db318c22fe3154e0c09dd1" + integrity sha512-f/I5G2iJgU1h0XrrjRD0hHMr7C10u276vYvm//rw1TzFcYQ4xTOyAoi9oNAHRU0JU4mY9eTuxdVc2zahdMuhaQ== + dependencies: + handlebars "^4.7.7" + solidity-ast "^0.4.38" + source-map-support@^0.5.13, source-map-support@^0.5.19: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -6778,7 +6700,7 @@ string-format@^2.0.0: resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6804,6 +6726,15 @@ string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -6854,7 +6785,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6875,6 +6806,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -8049,7 +7987,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -8066,6 +8004,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"