diff --git a/.solhint.json b/.solhint.json index 03fea972..73ba182f 100644 --- a/.solhint.json +++ b/.solhint.json @@ -3,12 +3,13 @@ "plugins": ["prettier"], "rules": { "prettier/prettier": "warn", - "reentrancy": "off", - "modifier-name-mixedcase": "off", + "reentrancy": "warn", + "modifier-name-mixedcase": "warn", "no-empty-blocks": "off", - "func-visibility": "off", - "max-states-count": "off", + "func-visibility": ["warn", { "ignoreConstructors": true }], + "max-states-count": "warn", "not-rely-on-time": "off", - "compiler-version": "off" + "func-name-mixedcase": "off", + "no-inline-assembly": "off" } } diff --git a/contracts/access/MerkleWhitelisted.sol b/contracts/access/MerkleWhitelisted.sol index c4179257..d31d9772 100644 --- a/contracts/access/MerkleWhitelisted.sol +++ b/contracts/access/MerkleWhitelisted.sol @@ -22,16 +22,16 @@ abstract contract MerkleWhitelisted { bytes32 private _merkleRoot; + error LeafNotWhitelisted(bytes data); + error UserNotWhitelisted(address user); + modifier onlyWhitelisted(bytes memory data_, bytes32[] memory merkleProof_) { - require( - _isWhitelisted(keccak256(data_), merkleProof_), - "MerkleWhitelisted: not whitelisted" - ); + if (!_isWhitelisted(keccak256(data_), merkleProof_)) revert LeafNotWhitelisted(data_); _; } modifier onlyWhitelistedUser(address user_, bytes32[] memory merkleProof_) { - require(_isWhitelistedUser(user_, merkleProof_), "MerkleWhitelisted: not whitelisted"); + if (!_isWhitelistedUser(user_, merkleProof_)) revert UserNotWhitelisted(user_); _; } diff --git a/contracts/access/MultiOwnable.sol b/contracts/access/MultiOwnable.sol index 4e432807..9aa4d923 100644 --- a/contracts/access/MultiOwnable.sol +++ b/contracts/access/MultiOwnable.sol @@ -28,6 +28,9 @@ abstract contract MultiOwnable is IMultiOwnable, Initializable { EnumerableSet.AddressSet private _owners; + error InvalidOwner(); + error UnauthorizedAccount(address account); + modifier onlyOwner() { _checkOwner(); _; @@ -91,7 +94,7 @@ abstract contract MultiOwnable is IMultiOwnable, Initializable { function _addOwners(address[] memory newOwners_) private { _owners.add(newOwners_); - require(!_owners.contains(address(0)), "MultiOwnable: zero address can not be added"); + if (_owners.contains(address(0))) revert InvalidOwner(); emit OwnersAdded(newOwners_); } @@ -115,6 +118,6 @@ abstract contract MultiOwnable is IMultiOwnable, Initializable { * @dev Throws if the sender is not the owner. */ function _checkOwner() private view { - require(isOwner(msg.sender), "MultiOwnable: caller is not the owner"); + if (!isOwner(msg.sender)) revert UnauthorizedAccount(msg.sender); } } diff --git a/contracts/access/PermanentOwnable.sol b/contracts/access/PermanentOwnable.sol index e71e3284..e7bd6f6c 100644 --- a/contracts/access/PermanentOwnable.sol +++ b/contracts/access/PermanentOwnable.sol @@ -15,6 +15,9 @@ pragma solidity ^0.8.4; abstract contract PermanentOwnable { address private immutable _OWNER; + error InvalidOwner(); + error UnauthorizedAccount(address account); + /** * @dev Throws if called by any account other than the owner. */ @@ -28,7 +31,7 @@ abstract contract PermanentOwnable { * @param owner_ the address of the permanent owner. */ constructor(address owner_) { - require(owner_ != address(0), "PermanentOwnable: zero address can not be the owner"); + if (owner_ == address(0)) revert InvalidOwner(); _OWNER = owner_; } @@ -42,6 +45,6 @@ abstract contract PermanentOwnable { } function _onlyOwner() internal view virtual { - require(_OWNER == msg.sender, "PermanentOwnable: caller is not the owner"); + if (_OWNER != msg.sender) revert UnauthorizedAccount(msg.sender); } } diff --git a/contracts/access/RBAC.sol b/contracts/access/RBAC.sol index 234044f2..e641f8f1 100644 --- a/contracts/access/RBAC.sol +++ b/contracts/access/RBAC.sol @@ -53,13 +53,12 @@ abstract contract RBAC is IRBAC, Initializable { mapping(address => DynamicSet.StringSet) private _userRoles; + error EmptyRoles(); + error NoPermissionForResource(address account, string permission, string resource); + modifier onlyPermission(string memory resource_, string memory permission_) { - require( - hasPermission(msg.sender, resource_, permission_), - string( - abi.encodePacked("RBAC: no ", permission_, " permission for resource ", resource_) - ) - ); + if (!hasPermission(msg.sender, resource_, permission_)) + revert NoPermissionForResource(msg.sender, permission_, resource_); _; } @@ -79,7 +78,7 @@ abstract contract RBAC is IRBAC, Initializable { address to_, string[] memory rolesToGrant_ ) public virtual override onlyPermission(RBAC_RESOURCE, CREATE_PERMISSION) { - require(rolesToGrant_.length > 0, "RBAC: empty roles"); + if (rolesToGrant_.length == 0) revert EmptyRoles(); _grantRoles(to_, rolesToGrant_); } @@ -93,7 +92,7 @@ abstract contract RBAC is IRBAC, Initializable { address from_, string[] memory rolesToRevoke_ ) public virtual override onlyPermission(RBAC_RESOURCE, DELETE_PERMISSION) { - require(rolesToRevoke_.length > 0, "RBAC: empty roles"); + if (rolesToRevoke_.length == 0) revert EmptyRoles(); _revokeRoles(from_, rolesToRevoke_); } diff --git a/contracts/access/extensions/RBACGroupable.sol b/contracts/access/extensions/RBACGroupable.sol index 4bb9a44f..7ca59397 100644 --- a/contracts/access/extensions/RBACGroupable.sol +++ b/contracts/access/extensions/RBACGroupable.sol @@ -31,6 +31,8 @@ abstract contract RBACGroupable is IRBACGroupable, RBAC { mapping(address => DynamicSet.StringSet) private _userGroups; mapping(string => DynamicSet.StringSet) private _groupRoles; + error EmptyGroups(); + /** * @notice The initialization function */ @@ -47,7 +49,7 @@ abstract contract RBACGroupable is IRBACGroupable, RBAC { address who_, string[] memory groupsToAddTo_ ) public virtual override onlyPermission(RBAC_RESOURCE, CREATE_PERMISSION) { - require(groupsToAddTo_.length > 0, "RBACGroupable: empty groups"); + if (groupsToAddTo_.length == 0) revert EmptyGroups(); _addUserToGroups(who_, groupsToAddTo_); } @@ -61,7 +63,7 @@ abstract contract RBACGroupable is IRBACGroupable, RBAC { address who_, string[] memory groupsToRemoveFrom_ ) public virtual override onlyPermission(RBAC_RESOURCE, DELETE_PERMISSION) { - require(groupsToRemoveFrom_.length > 0, "RBACGroupable: empty groups"); + if (groupsToRemoveFrom_.length == 0) revert EmptyGroups(); _removeUserFromGroups(who_, groupsToRemoveFrom_); } @@ -75,7 +77,7 @@ abstract contract RBACGroupable is IRBACGroupable, RBAC { string memory groupTo_, string[] memory rolesToGrant_ ) public virtual override onlyPermission(RBAC_RESOURCE, CREATE_PERMISSION) { - require(rolesToGrant_.length > 0, "RBACGroupable: empty roles"); + if (rolesToGrant_.length == 0) revert EmptyRoles(); _grantGroupRoles(groupTo_, rolesToGrant_); } @@ -89,7 +91,7 @@ abstract contract RBACGroupable is IRBACGroupable, RBAC { string memory groupFrom_, string[] memory rolesToRevoke_ ) public virtual override onlyPermission(RBAC_RESOURCE, DELETE_PERMISSION) { - require(rolesToRevoke_.length > 0, "RBACGroupable: empty roles"); + if (rolesToRevoke_.length == 0) revert EmptyRoles(); _revokeGroupRoles(groupFrom_, rolesToRevoke_); } diff --git a/contracts/contracts-registry/AbstractContractsRegistry.sol b/contracts/contracts-registry/AbstractContractsRegistry.sol index 659e30d1..a0c9e093 100644 --- a/contracts/contracts-registry/AbstractContractsRegistry.sol +++ b/contracts/contracts-registry/AbstractContractsRegistry.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.4; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {TransparentProxyUpgrader} from "../proxy/transparent/TransparentProxyUpgrader.sol"; +import {AdminableProxyUpgrader} from "../proxy/adminable/AdminableProxyUpgrader.sol"; +import {AdminableProxy} from "../proxy/adminable/AdminableProxy.sol"; import {AbstractDependant} from "./AbstractDependant.sol"; /** @@ -26,7 +26,7 @@ import {AbstractDependant} from "./AbstractDependant.sol"; * 2) Making the system contracts-interchangeable * 3) Simplifying the contracts management and deployment * - * The ContractsRegistry acts as a TransparentProxy deployer. One can add proxy-compatible implementations to the registry + * The ContractsRegistry acts as a AdminableProxy deployer. One can add proxy-compatible implementations to the registry * and deploy proxies to them. Then these proxies can be upgraded easily using the provided interface. * The ContractsRegistry itself can be deployed behind a proxy as well. * @@ -38,7 +38,7 @@ import {AbstractDependant} from "./AbstractDependant.sol"; * Users may also fetch all the contracts present in the system as they are now located in a single place. */ abstract contract AbstractContractsRegistry is Initializable { - TransparentProxyUpgrader private _proxyUpgrader; + AdminableProxyUpgrader private _proxyUpgrader; mapping(string => address) private _contracts; mapping(address => bool) private _isProxy; @@ -48,11 +48,15 @@ abstract contract AbstractContractsRegistry is Initializable { event ProxyContractUpgraded(string name, address newImplementation); event ContractRemoved(string name); + error NoMappingExists(string contractName); + error NotAProxy(string contractName, address contractProxy); + error ZeroAddressProvided(string contractName); + /** * @notice The initialization function */ function __ContractsRegistry_init() internal onlyInitializing { - _proxyUpgrader = new TransparentProxyUpgrader(); + _proxyUpgrader = new AdminableProxyUpgrader(); } /** @@ -63,7 +67,7 @@ abstract contract AbstractContractsRegistry is Initializable { function getContract(string memory name_) public view returns (address) { address contractAddress_ = _contracts[name_]; - require(contractAddress_ != address(0), "ContractsRegistry: this mapping doesn't exist"); + _checkIfMappingExist(contractAddress_, name_); return contractAddress_; } @@ -93,8 +97,8 @@ abstract contract AbstractContractsRegistry is Initializable { function getImplementation(string memory name_) public view returns (address) { address contractProxy_ = _contracts[name_]; - require(contractProxy_ != address(0), "ContractsRegistry: this mapping doesn't exist"); - require(_isProxy[contractProxy_], "ContractsRegistry: not a proxy contract"); + if (contractProxy_ == address(0)) revert NoMappingExists(name_); + if (!_isProxy[contractProxy_]) revert NotAProxy(name_, contractProxy_); return _proxyUpgrader.getImplementation(contractProxy_); } @@ -118,7 +122,7 @@ abstract contract AbstractContractsRegistry is Initializable { ) internal virtual { address contractAddress_ = _contracts[name_]; - require(contractAddress_ != address(0), "ContractsRegistry: this mapping doesn't exist"); + _checkIfMappingExist(contractAddress_, name_); AbstractDependant dependant_ = AbstractDependant(contractAddress_); dependant_.setDependencies(address(this), data_); @@ -150,8 +154,8 @@ abstract contract AbstractContractsRegistry is Initializable { ) internal virtual { address contractToUpgrade_ = _contracts[name_]; - require(contractToUpgrade_ != address(0), "ContractsRegistry: this mapping doesn't exist"); - require(_isProxy[contractToUpgrade_], "ContractsRegistry: not a proxy contract"); + if (contractToUpgrade_ == address(0)) revert NoMappingExists(name_); + if (!_isProxy[contractToUpgrade_]) revert NotAProxy(name_, contractToUpgrade_); _proxyUpgrader.upgrade(contractToUpgrade_, newImplementation_, data_); @@ -165,7 +169,7 @@ abstract contract AbstractContractsRegistry is Initializable { * @param contractAddress_ the address of the contract */ function _addContract(string memory name_, address contractAddress_) internal virtual { - require(contractAddress_ != address(0), "ContractsRegistry: zero address is forbidden"); + if (contractAddress_ == address(0)) revert ZeroAddressProvided(name_); _contracts[name_] = contractAddress_; @@ -194,7 +198,7 @@ abstract contract AbstractContractsRegistry is Initializable { address contractAddress_, bytes memory data_ ) internal virtual { - require(contractAddress_ != address(0), "ContractsRegistry: zero address is forbidden"); + if (contractAddress_ == address(0)) revert ZeroAddressProvided(name_); address proxyAddr_ = _deployProxy(contractAddress_, address(_proxyUpgrader), data_); @@ -215,7 +219,7 @@ abstract contract AbstractContractsRegistry is Initializable { string memory name_, address contractAddress_ ) internal virtual { - require(contractAddress_ != address(0), "ContractsRegistry: zero address is forbidden"); + if (contractAddress_ == address(0)) revert ZeroAddressProvided(name_); _contracts[name_] = contractAddress_; _isProxy[contractAddress_] = true; @@ -234,7 +238,7 @@ abstract contract AbstractContractsRegistry is Initializable { function _removeContract(string memory name_) internal virtual { address contractAddress_ = _contracts[name_]; - require(contractAddress_ != address(0), "ContractsRegistry: this mapping doesn't exist"); + _checkIfMappingExist(contractAddress_, name_); delete _isProxy[contractAddress_]; delete _contracts[name_]; @@ -254,6 +258,10 @@ abstract contract AbstractContractsRegistry is Initializable { address admin_, bytes memory data_ ) internal virtual returns (address) { - return address(new TransparentUpgradeableProxy(contractAddress_, admin_, data_)); + return address(new AdminableProxy(contractAddress_, admin_, data_)); + } + + function _checkIfMappingExist(address contractAddress_, string memory name_) internal pure { + if (contractAddress_ == address(0)) revert NoMappingExists(name_); } } diff --git a/contracts/contracts-registry/AbstractDependant.sol b/contracts/contracts-registry/AbstractDependant.sol index 451478a0..42acbd7d 100644 --- a/contracts/contracts-registry/AbstractDependant.sol +++ b/contracts/contracts-registry/AbstractDependant.sol @@ -22,6 +22,8 @@ abstract contract AbstractDependant { bytes32 private constant _INJECTOR_SLOT = 0x3d1f25f1ac447e55e7fec744471c4dab1c6a2b6ffb897825f9ea3d2e8c9be583; + error NotAnInjector(address injector, address caller); + modifier dependant() { _checkInjector(); _; @@ -76,6 +78,7 @@ abstract contract AbstractDependant { function _checkInjector() internal view { address injector_ = getInjector(); - require(injector_ == address(0) || injector_ == msg.sender, "Dependant: not an injector"); + if (injector_ != address(0) && injector_ != msg.sender) + revert NotAnInjector(injector_, msg.sender); } } diff --git a/contracts/contracts-registry/pools/AbstractPoolContractsRegistry.sol b/contracts/contracts-registry/pools/AbstractPoolContractsRegistry.sol index 0ff1e192..b02dc3d9 100644 --- a/contracts/contracts-registry/pools/AbstractPoolContractsRegistry.sol +++ b/contracts/contracts-registry/pools/AbstractPoolContractsRegistry.sol @@ -34,6 +34,10 @@ abstract contract AbstractPoolContractsRegistry is Initializable, AbstractDepend mapping(string => ProxyBeacon) private _beacons; mapping(string => EnumerableSet.AddressSet) private _pools; // name => pool + error NoMappingExists(string poolName); + error NoPoolsToInject(string poolName); + error ProxyDoesNotExist(string poolName); + /** * @notice The proxy initializer function */ @@ -66,10 +70,7 @@ abstract contract AbstractPoolContractsRegistry is Initializable, AbstractDepend * @return address_ the implementation these pools point to */ function getImplementation(string memory name_) public view returns (address) { - require( - address(_beacons[name_]) != address(0), - "PoolContractsRegistry: this mapping doesn't exist" - ); + if (address(_beacons[name_]) == address(0)) revert NoMappingExists(name_); return _beacons[name_].implementation(); } @@ -82,7 +83,7 @@ abstract contract AbstractPoolContractsRegistry is Initializable, AbstractDepend function getProxyBeacon(string memory name_) public view returns (address) { address beacon_ = address(_beacons[name_]); - require(beacon_ != address(0), "PoolContractsRegistry: bad ProxyBeacon"); + if (beacon_ == address(0)) revert ProxyDoesNotExist(name_); return beacon_; } @@ -173,7 +174,7 @@ abstract contract AbstractPoolContractsRegistry is Initializable, AbstractDepend uint256 to_ = (offset_ + limit_).min(_namedPools.length()).max(offset_); - require(to_ != offset_, "PoolContractsRegistry: no pools to inject"); + if (to_ == offset_) revert NoPoolsToInject(name_); address contractsRegistry_ = _contractsRegistry; diff --git a/contracts/contracts-registry/pools/presets/OwnablePoolContractsRegistry.sol b/contracts/contracts-registry/pools/presets/OwnablePoolContractsRegistry.sol index 7d0ee0f0..5e5d76e2 100644 --- a/contracts/contracts-registry/pools/presets/OwnablePoolContractsRegistry.sol +++ b/contracts/contracts-registry/pools/presets/OwnablePoolContractsRegistry.sol @@ -16,7 +16,7 @@ abstract contract OwnablePoolContractsRegistry is * @notice The initialization function */ function __OwnablePoolContractsRegistry_init() public initializer { - __Ownable_init(); + __Ownable_init(msg.sender); __PoolContractsRegistry_init(); } diff --git a/contracts/contracts-registry/presets/MultiOwnableContractsRegistry.sol b/contracts/contracts-registry/presets/MultiOwnableContractsRegistry.sol index b4f0980d..f1470ed1 100644 --- a/contracts/contracts-registry/presets/MultiOwnableContractsRegistry.sol +++ b/contracts/contracts-registry/presets/MultiOwnableContractsRegistry.sol @@ -72,7 +72,7 @@ contract MultiOwnableContractsRegistry is AbstractContractsRegistry, MultiOwnabl } /** - * @notice The function to add the proxy contract to the registry (deploys TransparentProxy on top) + * @notice The function to add the proxy contract to the registry (deploys AdminableProxy on top) * @param name_ the associative name of the contract * @param contractAddress_ the address of the implementation contract to add */ @@ -81,7 +81,7 @@ contract MultiOwnableContractsRegistry is AbstractContractsRegistry, MultiOwnabl } /** - * @notice The function to add the proxy contract to the registry with immediate call (deploys TransparentProxy on top) + * @notice The function to add the proxy contract to the registry with immediate call (deploys AdminableProxy on top) * @param name_ the associative name of the contract * @param contractAddress_ the address of the implementation contract to add * @param data_ the data the proxy contract will be called after the addition diff --git a/contracts/contracts-registry/presets/OwnableContractsRegistry.sol b/contracts/contracts-registry/presets/OwnableContractsRegistry.sol index 5ce4d4d0..813e5e8c 100644 --- a/contracts/contracts-registry/presets/OwnableContractsRegistry.sol +++ b/contracts/contracts-registry/presets/OwnableContractsRegistry.sol @@ -13,7 +13,7 @@ contract OwnableContractsRegistry is AbstractContractsRegistry, OwnableUpgradeab * @notice The initialization function */ function __OwnableContractsRegistry_init() public initializer { - __Ownable_init(); + __Ownable_init(msg.sender); __ContractsRegistry_init(); } @@ -73,7 +73,7 @@ contract OwnableContractsRegistry is AbstractContractsRegistry, OwnableUpgradeab } /** - * @notice The function to add the proxy contract to the registry (deploys TransparentProxy on top) + * @notice The function to add the proxy contract to the registry (deploys AdminableProxy on top) * @param name_ the associative name of the contract * @param contractAddress_ the address of the implementation contract to add */ @@ -82,7 +82,7 @@ contract OwnableContractsRegistry is AbstractContractsRegistry, OwnableUpgradeab } /** - * @notice The function to add the proxy contract to the registry with immediate call (deploys TransparentProxy on top) + * @notice The function to add the proxy contract to the registry with immediate call (deploys AdminableProxy on top) * @param name_ the associative name of the contract * @param contractAddress_ the address of the implementation contract to add * @param data_ the data the proxy contract will be called after the addition diff --git a/contracts/diamond/Diamond.sol b/contracts/diamond/Diamond.sol index 11b1fbb8..98ccba86 100644 --- a/contracts/diamond/Diamond.sol +++ b/contracts/diamond/Diamond.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {DiamondStorage} from "./DiamondStorage.sol"; @@ -20,7 +19,6 @@ import {DiamondStorage} from "./DiamondStorage.sol"; * If you wish to add a receive() function, attach a "0x00000000" selector to a facet that has such a function. */ contract Diamond is DiamondStorage { - using Address for address; using EnumerableSet for EnumerableSet.Bytes32Set; using EnumerableSet for EnumerableSet.AddressSet; @@ -38,6 +36,16 @@ contract Diamond is DiamondStorage { event DiamondCut(Facet[] facets, address initFacet, bytes initData); + error FacetIsZeroAddress(); + error InitializationReverted(address initFacet, bytes initData); + error NoSelectorsProvided(); + error NoFacetForSelector(bytes4 selector); + + error SelectorAlreadyAdded(address faucet, bytes4 selector); + error SelectorFromAnotherFacet(bytes4 selector); + error SelectorIsAlreadyInThisFaucet(bytes4 selector, address facet); + error SelectorNotRegistered(bytes4 selector); + /** * @notice The payable fallback function that delegatecall's the facet with associated selector */ @@ -45,7 +53,7 @@ contract Diamond is DiamondStorage { fallback() external payable virtual { address facet_ = facetAddress(msg.sig); - require(facet_ != address(0), "Diamond: selector is not registered"); + if (facet_ == address(0)) revert SelectorNotRegistered(msg.sig); _beforeFallback(facet_, msg.sig); @@ -101,17 +109,13 @@ contract Diamond is DiamondStorage { * @param selectors_ the function selectors the implementation has */ function _addFacet(address facet_, bytes4[] memory selectors_) internal virtual { - require(facet_ != address(0), "Diamond: facet cannot be zero address"); - require(facet_.isContract(), "Diamond: facet is not a contract"); - require(selectors_.length != 0, "Diamond: no selectors provided"); + _checkIfFacetIsValid(facet_, selectors_); DStorage storage _ds = _getDiamondStorage(); for (uint256 i = 0; i < selectors_.length; i++) { - require( - _ds.selectorToFacet[selectors_[i]] == address(0), - "Diamond: selector already added" - ); + if (_ds.selectorToFacet[selectors_[i]] != address(0)) + revert SelectorAlreadyAdded(_ds.selectorToFacet[selectors_[i]], selectors_[i]); _ds.selectorToFacet[selectors_[i]] = facet_; _ds.facetToSelectors[facet_].add(bytes32(selectors_[i])); @@ -126,16 +130,13 @@ contract Diamond is DiamondStorage { * @param selectors_ the selectors of that implementation to be removed */ function _removeFacet(address facet_, bytes4[] memory selectors_) internal virtual { - require(facet_ != address(0), "Diamond: facet cannot be zero address"); - require(selectors_.length != 0, "Diamond: no selectors provided"); + _checkIfFacetIsValid(facet_, selectors_); DStorage storage _ds = _getDiamondStorage(); for (uint256 i = 0; i < selectors_.length; i++) { - require( - _ds.selectorToFacet[selectors_[i]] == facet_, - "Diamond: selector from another facet" - ); + if (_ds.selectorToFacet[selectors_[i]] != facet_) + revert SelectorFromAnotherFacet(selectors_[i]); _ds.selectorToFacet[selectors_[i]] = address(0); _ds.facetToSelectors[facet_].remove(bytes32(selectors_[i])); @@ -152,9 +153,7 @@ contract Diamond is DiamondStorage { * @param selectors_ the selectors of the facet */ function _updateFacet(address facet_, bytes4[] memory selectors_) internal virtual { - require(facet_ != address(0), "Diamond: facet cannot be zero address"); - require(facet_.isContract(), "Diamond: facet is not a contract"); - require(selectors_.length != 0, "Diamond: no selectors provided"); + _checkIfFacetIsValid(facet_, selectors_); DStorage storage _ds = _getDiamondStorage(); @@ -162,8 +161,8 @@ contract Diamond is DiamondStorage { bytes4 selector_ = selectors_[i]; address oldFacet_ = facetAddress(selector_); - require(oldFacet_ != facet_, "Diamond: cannot replace to the same facet"); - require(oldFacet_ != address(0), "Diamond: no facet found for selector"); + if (oldFacet_ == facet_) revert SelectorIsAlreadyInThisFaucet(selector_, facet_); + if (oldFacet_ == address(0)) revert NoFacetForSelector(selector_); // replace old facet address _ds.selectorToFacet[selector_] = facet_; @@ -190,12 +189,12 @@ contract Diamond is DiamondStorage { return; } - require(initFacet_.isContract(), "Diamond: init_ address has no code"); - + // solhint-disable-next-line (bool success_, bytes memory err_) = initFacet_.delegatecall(initData_); if (!success_) { - require(err_.length > 0, "Diamond: initialization function reverted"); + if (err_.length == 0) revert InitializationReverted(initFacet_, initData_); + // bubble up error // @solidity memory-safe-assembly assembly { @@ -204,5 +203,13 @@ contract Diamond is DiamondStorage { } } + function _checkIfFacetIsValid( + address facet_, + bytes4[] memory selectors_ + ) internal pure virtual { + if (facet_ == address(0)) revert FacetIsZeroAddress(); + if (selectors_.length == 0) revert NoSelectorsProvided(); + } + function _beforeFallback(address facet_, bytes4 selector_) internal virtual {} } diff --git a/contracts/diamond/access/access-control/DiamondAccessControl.sol b/contracts/diamond/access/access-control/DiamondAccessControl.sol index 09c0ac26..2bcc427d 100644 --- a/contracts/diamond/access/access-control/DiamondAccessControl.sol +++ b/contracts/diamond/access/access-control/DiamondAccessControl.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; +// solhint-disable-next-line no-unused-import import {DiamondAccessControlStorage, IAccessControl} from "./DiamondAccessControlStorage.sol"; /** @@ -10,6 +11,9 @@ import {DiamondAccessControlStorage, IAccessControl} from "./DiamondAccessContro * by the Diamond Standard. */ abstract contract DiamondAccessControl is DiamondAccessControlStorage { + error UnauthorizedAccount(address account); + error RoleAlreadyGranted(bytes32 role, address account); + /** * @notice Sets `DEFAULT_ADMIN_ROLE` to `msg.sender` */ @@ -44,7 +48,7 @@ abstract contract DiamondAccessControl is DiamondAccessControlStorage { * @inheritdoc IAccessControl */ function renounceRole(bytes32 role_, address account_) public virtual override { - require(account_ == msg.sender, "AccessControl: can only renounce roles for self"); + if (account_ != msg.sender) revert UnauthorizedAccount(msg.sender); _revokeRole(role_, account_); } @@ -70,7 +74,7 @@ abstract contract DiamondAccessControl is DiamondAccessControlStorage { * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role_, address account_) internal virtual { - require(!hasRole(role_, account_), "AccessControl: role is granted"); + if (hasRole(role_, account_)) revert RoleAlreadyGranted(role_, account_); _getAccessControlStorage().roles[role_].members[account_] = true; @@ -85,7 +89,7 @@ abstract contract DiamondAccessControl is DiamondAccessControlStorage { * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role_, address account_) internal virtual { - require(hasRole(role_, account_), "AccessControl: role is not granted"); + if (!hasRole(role_, account_)) revert RoleNotGranted(role_, account_); _getAccessControlStorage().roles[role_].members[account_] = false; diff --git a/contracts/diamond/access/access-control/DiamondAccessControlStorage.sol b/contracts/diamond/access/access-control/DiamondAccessControlStorage.sol index c3b4fa71..bbb56054 100644 --- a/contracts/diamond/access/access-control/DiamondAccessControlStorage.sol +++ b/contracts/diamond/access/access-control/DiamondAccessControlStorage.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.4; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {InitializableStorage} from "../../utils/InitializableStorage.sol"; @@ -26,13 +25,11 @@ abstract contract DiamondAccessControlStorage is IAccessControl, InitializableSt mapping(bytes32 => RoleData) roles; } + error RoleNotGranted(bytes32 role, address account); + /** * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * with a custom error including the required role. */ modifier onlyRole(bytes32 role_) { _checkRole(role_); @@ -62,34 +59,17 @@ abstract contract DiamondAccessControlStorage is IAccessControl, InitializableSt } /** - * @dev Revert with a standard message if `_msgSender()` is missing `role`. + * @dev Revert with a custom error if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. - * - * Format of the revert message is described in {_checkRole}. */ function _checkRole(bytes32 role_) internal view virtual { _checkRole(role_, msg.sender); } /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ + * @dev Revert with a custom error if `account` is missing `role`. */ function _checkRole(bytes32 role_, address account_) internal view virtual { - if (!hasRole(role_, account_)) { - revert( - string( - abi.encodePacked( - "AccessControl: account ", - Strings.toHexString(account_), - " is missing role ", - Strings.toHexString(uint256(role_), 32) - ) - ) - ); - } + if (!hasRole(role_, account_)) revert RoleNotGranted(role_, account_); } } diff --git a/contracts/diamond/access/ownable/DiamondOwnable.sol b/contracts/diamond/access/ownable/DiamondOwnable.sol index b86113b7..bf042623 100644 --- a/contracts/diamond/access/ownable/DiamondOwnable.sol +++ b/contracts/diamond/access/ownable/DiamondOwnable.sol @@ -12,6 +12,8 @@ import {DiamondOwnableStorage} from "./DiamondOwnableStorage.sol"; contract DiamondOwnable is DiamondOwnableStorage { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + error InvalidOwner(); + /** * @notice Transfers ownership to `msg.sender` */ @@ -24,7 +26,7 @@ contract DiamondOwnable is DiamondOwnableStorage { * @param newOwner_ the new owner of the Diamond */ function transferOwnership(address newOwner_) public virtual onlyOwner { - require(newOwner_ != address(0), "DiamondOwnable: zero address owner"); + if (newOwner_ == address(0)) revert InvalidOwner(); _transferOwnership(newOwner_); } diff --git a/contracts/diamond/access/ownable/DiamondOwnableStorage.sol b/contracts/diamond/access/ownable/DiamondOwnableStorage.sol index 0f29a371..f1aef3ad 100644 --- a/contracts/diamond/access/ownable/DiamondOwnableStorage.sol +++ b/contracts/diamond/access/ownable/DiamondOwnableStorage.sol @@ -16,6 +16,8 @@ abstract contract DiamondOwnableStorage is InitializableStorage { address owner; } + error CallerNotOwner(address caller, address owner); + modifier onlyOwner() { _onlyOwner(); _; @@ -41,6 +43,6 @@ abstract contract DiamondOwnableStorage is InitializableStorage { * @notice The function to check if `msg.sender` is the owner */ function _onlyOwner() internal view virtual { - require(owner() == msg.sender, "DiamondOwnable: not an owner"); + if (owner() != msg.sender) revert CallerNotOwner(msg.sender, owner()); } } diff --git a/contracts/diamond/tokens/ERC20/DiamondERC20.sol b/contracts/diamond/tokens/ERC20/DiamondERC20.sol index 5e3115c1..cc6fb1d1 100644 --- a/contracts/diamond/tokens/ERC20/DiamondERC20.sol +++ b/contracts/diamond/tokens/ERC20/DiamondERC20.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; +// solhint-disable-next-line no-unused-import import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {DiamondERC20Storage} from "./DiamondERC20Storage.sol"; @@ -12,6 +13,13 @@ import {DiamondERC20Storage} from "./DiamondERC20Storage.sol"; * by the Diamond Standard. */ contract DiamondERC20 is DiamondERC20Storage { + error ApproverIsZeroAddress(); + error InsufficientAllowance(address spender, uint256 allowance, uint256 needed); + error InsufficientBalance(address sender, uint256 balance, uint256 needed); + error ReceiverIsZeroAddress(); + error SenderIsZeroAddress(); + error SpenderIsZeroAddress(); + /** * @notice Sets the values for {name} and {symbol}. * @@ -61,86 +69,81 @@ contract DiamondERC20 is DiamondERC20Storage { /** * @notice Moves `amount` of tokens from `from` to `to`. + * @dev This function is not virtual, {_update} should be overridden instead. */ - function _transfer(address from_, address to_, uint256 amount_) internal virtual { - require(from_ != address(0), "ERC20: transfer from the zero address"); - require(to_ != address(0), "ERC20: transfer to the zero address"); - - _beforeTokenTransfer(from_, to_, amount_); - - DERC20Storage storage _erc20Storage = _getErc20Storage(); - - uint256 fromBalance_ = _erc20Storage.balances[from_]; - - require(fromBalance_ >= amount_, "ERC20: transfer amount exceeds balance"); - - unchecked { - _erc20Storage.balances[from_] = fromBalance_ - amount_; - - // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by - // decrementing then incrementing. - _erc20Storage.balances[to_] += amount_; - } + function _transfer(address from_, address to_, uint256 amount_) internal { + if (from_ == address(0)) revert SenderIsZeroAddress(); + if (to_ == address(0)) revert ReceiverIsZeroAddress(); - emit Transfer(from_, to_, amount_); - - _afterTokenTransfer(from_, to_, amount_); + _update(from_, to_, amount_); } /** * @notice Creates `amount` tokens and assigns them to `account`, increasing * the total supply. + * @dev This function is not virtual, {_update} should be overridden instead. */ - function _mint(address account_, uint256 amount_) internal virtual { - require(account_ != address(0), "ERC20: mint to the zero address"); - - _beforeTokenTransfer(address(0), account_, amount_); - - DERC20Storage storage _erc20Storage = _getErc20Storage(); - - _erc20Storage.totalSupply += amount_; - - unchecked { - // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. - _erc20Storage.balances[account_] += amount_; - } - - emit Transfer(address(0), account_, amount_); + function _mint(address account_, uint256 amount_) internal { + if (account_ == address(0)) revert ReceiverIsZeroAddress(); - _afterTokenTransfer(address(0), account_, amount_); + _update(address(0), account_, amount_); } /** * @notice Destroys `amount` tokens from `account`, reducing the * total supply. + * @dev This function is not virtual, {_update} should be overridden instead. */ - function _burn(address account_, uint256 amount_) internal virtual { - require(account_ != address(0), "ERC20: burn from the zero address"); + function _burn(address account_, uint256 amount_) internal { + if (account_ == address(0)) revert SenderIsZeroAddress(); - _beforeTokenTransfer(account_, address(0), amount_); + _update(account_, address(0), amount_); + } + /** + * @dev Transfers a `amount` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * Emits a {Transfer} event. + */ + function _update(address from_, address to_, uint256 amount_) internal virtual { DERC20Storage storage _erc20Storage = _getErc20Storage(); - uint256 accountBalance_ = _erc20Storage.balances[account_]; - require(accountBalance_ >= amount_, "ERC20: burn amount exceeds balance"); + if (from_ == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + _erc20Storage.totalSupply += amount_; + } else { + uint256 fromBalance_ = _erc20Storage.balances[from_]; - unchecked { - _erc20Storage.balances[account_] -= amount_; - // Overflow not possible: amount <= accountBalance <= totalSupply. - _erc20Storage.totalSupply -= amount_; + if (fromBalance_ < amount_) revert InsufficientBalance(from_, fromBalance_, amount_); + + unchecked { + // Overflow not possible: amount <= fromBalance <= totalSupply. + _erc20Storage.balances[from_] = fromBalance_ - amount_; + } } - emit Transfer(account_, address(0), amount_); + if (to_ == address(0)) { + unchecked { + // Overflow not possible: amount <= fromBalance <= totalSupply. + _erc20Storage.totalSupply -= amount_; + } + } else { + unchecked { + // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. + _erc20Storage.balances[to_] += amount_; + } + } - _afterTokenTransfer(account_, address(0), amount_); + emit Transfer(from_, to_, amount_); } /** * @notice Sets `amount` as the allowance of `spender` over the `owner` s tokens. */ function _approve(address owner_, address spender_, uint256 amount_) internal virtual { - require(owner_ != address(0), "ERC20: approve from the zero address"); - require(spender_ != address(0), "ERC20: approve to the zero address"); + if (owner_ == address(0)) revert ApproverIsZeroAddress(); + if (spender_ == address(0)) revert SpenderIsZeroAddress(); _getErc20Storage().allowances[owner_][spender_] = amount_; @@ -154,23 +157,12 @@ contract DiamondERC20 is DiamondERC20Storage { uint256 currentAllowance_ = allowance(owner_, spender_); if (currentAllowance_ != type(uint256).max) { - require(currentAllowance_ >= amount_, "ERC20: insufficient allowance"); + if (currentAllowance_ < amount_) + revert InsufficientAllowance(spender_, currentAllowance_, amount_); unchecked { _approve(owner_, spender_, currentAllowance_ - amount_); } } } - - /** - * @notice Hook that is called before any transfer of tokens. This includes - * minting and burning. - */ - function _beforeTokenTransfer(address from_, address to_, uint256 amount_) internal virtual {} - - /** - * @notice Hook that is called after any transfer of tokens. This includes - * minting and burning. - */ - function _afterTokenTransfer(address from_, address to_, uint256 amount_) internal virtual {} } diff --git a/contracts/diamond/tokens/ERC721/DiamondERC721.sol b/contracts/diamond/tokens/ERC721/DiamondERC721.sol index 148138c3..e87bd183 100644 --- a/contracts/diamond/tokens/ERC721/DiamondERC721.sol +++ b/contracts/diamond/tokens/ERC721/DiamondERC721.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; +// solhint-disable-next-line no-unused-import import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {DiamondERC721Storage} from "./DiamondERC721Storage.sol"; @@ -14,7 +14,15 @@ import {DiamondERC721Storage} from "./DiamondERC721Storage.sol"; * by the Diamond Standard. */ contract DiamondERC721 is DiamondERC721Storage { - using Address for address; + error ApproveToCaller(address caller); + error ApprovalToCurrentOwner(address owner, uint256 tokenId); + error ConsecutiveTransfersNotSupported(); + error InvalidApprover(address approver, address owner); + error InvalidSpender(address spender, uint256 tokenId); + error NonERC721Receiver(address receiver); + error ReceiverIsZeroAddress(); + error TokenAlreadyMinted(uint256 tokenId); + error UnauthorizedAccount(address account); /** * @notice Sets the values for {name} and {symbol}. @@ -34,12 +42,10 @@ contract DiamondERC721 is DiamondERC721Storage { */ function approve(address to_, uint256 tokenId_) public virtual override { address owner_ = ownerOf(tokenId_); - require(to_ != owner_, "ERC721: approval to current owner"); - - require( - msg.sender == owner_ || isApprovedForAll(owner_, msg.sender), - "ERC721: approve caller is not token owner or approved for all" - ); + + if (to_ == owner_) revert ApprovalToCurrentOwner(owner_, tokenId_); + if (msg.sender != owner_ && !isApprovedForAll(owner_, msg.sender)) + revert InvalidApprover(msg.sender, owner_); _approve(to_, tokenId_); } @@ -55,10 +61,7 @@ contract DiamondERC721 is DiamondERC721Storage { * @inheritdoc IERC721 */ function transferFrom(address from_, address to_, uint256 tokenId_) public virtual override { - require( - _isApprovedOrOwner(msg.sender, tokenId_), - "ERC721: caller is not token owner or approved" - ); + if (!_isApprovedOrOwner(msg.sender, tokenId_)) revert InvalidSpender(msg.sender, tokenId_); _transfer(from_, to_, tokenId_); } @@ -83,10 +86,7 @@ contract DiamondERC721 is DiamondERC721Storage { uint256 tokenId_, bytes memory data_ ) public virtual override { - require( - _isApprovedOrOwner(msg.sender, tokenId_), - "ERC721: caller is not token owner or approved" - ); + if (!_isApprovedOrOwner(msg.sender, tokenId_)) revert InvalidSpender(msg.sender, tokenId_); _safeTransfer(from_, to_, tokenId_, data_); } @@ -103,10 +103,7 @@ contract DiamondERC721 is DiamondERC721Storage { ) internal virtual { _transfer(from_, to_, tokenId_); - require( - _checkOnERC721Received(from_, to_, tokenId_, data_), - "ERC721: transfer to non ERC721Receiver implementer" - ); + if (!_checkOnERC721Received(from_, to_, tokenId_, data_)) revert NonERC721Receiver(to_); } /** @@ -122,91 +119,99 @@ contract DiamondERC721 is DiamondERC721Storage { function _safeMint(address to_, uint256 tokenId_, bytes memory data_) internal virtual { _mint(to_, tokenId_); - require( - _checkOnERC721Received(address(0), to_, tokenId_, data_), - "ERC721: transfer to non ERC721Receiver implementer" - ); + if (!_checkOnERC721Received(address(0), to_, tokenId_, data_)) + revert NonERC721Receiver(to_); } /** * @notice Mints `tokenId` and transfers it to `to`. + * @dev This function is not virtual, {_update} should be overridden instead. */ - function _mint(address to_, uint256 tokenId_) internal virtual { - require(to_ != address(0), "ERC721: mint to the zero address"); - require(!_exists(tokenId_), "ERC721: token already minted"); - - _beforeTokenTransfer(address(0), to_, tokenId_, 1); + function _mint(address to_, uint256 tokenId_) internal { + if (to_ == address(0)) revert ReceiverIsZeroAddress(); + if (_exists(tokenId_)) revert TokenAlreadyMinted(tokenId_); - // Check that tokenId was not minted by `_beforeTokenTransfer` hook - require(!_exists(tokenId_), "ERC721: token already minted"); + address previousOwner_ = _update(to_, tokenId_, 1); - DERC721Storage storage _erc721Storage = _getErc721Storage(); - - unchecked { - _erc721Storage.balances[to_] += 1; - } - - _erc721Storage.owners[tokenId_] = to_; - - emit Transfer(address(0), to_, tokenId_); - - _afterTokenTransfer(address(0), to_, tokenId_, 1); + if (previousOwner_ != address(0)) revert TokenAlreadyMinted(tokenId_); } /** * @notice Destroys `tokenId`. + * @dev This function is not virtual, {_update} should be overridden instead. */ - function _burn(uint256 tokenId_) internal virtual { - address owner_ = ownerOf(tokenId_); + function _burn(uint256 tokenId_) internal { + address owner_ = _update(address(0), tokenId_, 1); - _beforeTokenTransfer(owner_, address(0), tokenId_, 1); - - // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook - owner_ = ownerOf(tokenId_); + if (owner_ == address(0)) revert NonexistentToken(tokenId_); + } - DERC721Storage storage _erc721Storage = _getErc721Storage(); + /** + * @notice Transfers `tokenId` from `from` to `to`. + * @dev This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from_, address to_, uint256 tokenId_) internal { + if (to_ == address(0)) revert ReceiverIsZeroAddress(); - // Clear approvals - delete _erc721Storage.tokenApprovals[tokenId_]; + address previousOwner_ = _update(to_, tokenId_, 1); - unchecked { - _erc721Storage.balances[owner_] -= 1; + if (previousOwner_ == address(0)) { + revert NonexistentToken(tokenId_); + } else if (previousOwner_ != from_) { + revert UnauthorizedAccount(from_); } - - delete _erc721Storage.owners[tokenId_]; - - emit Transfer(owner_, address(0), tokenId_); - - _afterTokenTransfer(owner_, address(0), tokenId_, 1); } /** - * @notice Transfers `tokenId` from `from` to `to`. + * @notice Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the + * current owner (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. + * Emits a {Transfer} event. */ - function _transfer(address from_, address to_, uint256 tokenId_) internal virtual { - require(ownerOf(tokenId_) == from_, "ERC721: transfer from incorrect owner"); - require(to_ != address(0), "ERC721: transfer to the zero address"); + function _update( + address to_, + uint256 tokenId_, + uint256 batchSize_ + ) internal virtual returns (address) { + if (batchSize_ > 1) { + // Will only trigger during construction. Batch transferring (minting) is not available afterwards. + revert ConsecutiveTransfersNotSupported(); + } - _beforeTokenTransfer(from_, to_, tokenId_, 1); + DERC721Storage storage _erc721Storage = _getErc721Storage(); - // Check that tokenId was not transferred by `_beforeTokenTransfer` hook - require(ownerOf(tokenId_) == from_, "ERC721: transfer from incorrect owner"); + address from_ = _ownerOf(tokenId_); - DERC721Storage storage _erc721Storage = _getErc721Storage(); + if (from_ == address(0)) { + _addTokenToAllTokensEnumeration(tokenId_); + } else { + if (from_ != to_) { + _removeTokenFromOwnerEnumeration(from_, tokenId_); + } + + delete _erc721Storage.tokenApprovals[tokenId_]; + + unchecked { + _erc721Storage.balances[from_] -= 1; + } + } - // Clear approvals from the previous owner - delete _erc721Storage.tokenApprovals[tokenId_]; + if (to_ == address(0)) { + _removeTokenFromAllTokensEnumeration(tokenId_); + } else { + if (to_ != from_) { + _addTokenToOwnerEnumeration(to_, tokenId_); + } - unchecked { - _erc721Storage.balances[from_] -= 1; - _erc721Storage.balances[to_] += 1; + unchecked { + _erc721Storage.balances[to_] += 1; + } } _getErc721Storage().owners[tokenId_] = to_; emit Transfer(from_, to_, tokenId_); - _afterTokenTransfer(from_, to_, tokenId_, 1); + return from_; } /** @@ -226,7 +231,7 @@ contract DiamondERC721 is DiamondERC721Storage { address operator_, bool approved_ ) internal virtual { - require(owner_ != operator_, "ERC721: approve to caller"); + if (owner_ == operator_) revert ApproveToCaller(owner_); _getErc721Storage().operatorApprovals[owner_][operator_] = approved_; @@ -242,15 +247,15 @@ contract DiamondERC721 is DiamondERC721Storage { address to_, uint256 tokenId_, bytes memory data_ - ) private returns (bool) { - if (to_.isContract()) { + ) internal virtual returns (bool) { + if (to_.code.length > 0) { try IERC721Receiver(to_).onERC721Received(msg.sender, from_, tokenId_, data_) returns ( bytes4 retval ) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { - revert("ERC721: transfer to non ERC721Receiver implementer"); + revert NonERC721Receiver(to_); } else { // @solidity memory-safe-assembly assembly { @@ -263,45 +268,6 @@ contract DiamondERC721 is DiamondERC721Storage { } } - /** - * @notice Hook that is called before any token transfer. This includes minting and burning. - */ - function _beforeTokenTransfer( - address from_, - address to_, - uint256 firstTokenId_, - uint256 batchSize_ - ) internal virtual { - if (batchSize_ > 1) { - // Will only trigger during construction. Batch transferring (minting) is not available afterwards. - revert("ERC721Enumerable: consecutive transfers not supported"); - } - - uint256 tokenId_ = firstTokenId_; - - if (from_ == address(0)) { - _addTokenToAllTokensEnumeration(tokenId_); - } else if (from_ != to_) { - _removeTokenFromOwnerEnumeration(from_, tokenId_); - } - - if (to_ == address(0)) { - _removeTokenFromAllTokensEnumeration(tokenId_); - } else if (to_ != from_) { - _addTokenToOwnerEnumeration(to_, tokenId_); - } - } - - /** - * @notice Hook that is called after any token transfer. This includes minting and burning. - */ - function _afterTokenTransfer( - address from_, - address to_, - uint256 firstTokenId_, - uint256 batchSize_ - ) internal virtual {} - /** * @notice Private function to add a token to ownership-tracking data structures. */ diff --git a/contracts/diamond/tokens/ERC721/DiamondERC721Storage.sol b/contracts/diamond/tokens/ERC721/DiamondERC721Storage.sol index 6ba7c047..321e726c 100644 --- a/contracts/diamond/tokens/ERC721/DiamondERC721Storage.sol +++ b/contracts/diamond/tokens/ERC721/DiamondERC721Storage.sol @@ -39,6 +39,10 @@ abstract contract DiamondERC721Storage is mapping(address => mapping(uint256 => uint256)) ownedTokens; } + error IndexOutOfBounds(uint256 index); + error NonexistentToken(uint256 tokenId); + error OwnerIndexOutOfBounds(address owner, uint256 index); + function _getErc721Storage() internal pure returns (DERC721Storage storage _erc721Storage) { bytes32 slot_ = DIAMOND_ERC721_STORAGE_SLOT; @@ -113,7 +117,7 @@ abstract contract DiamondERC721Storage is address owner_, uint256 index_ ) public view virtual returns (uint256) { - require(index_ < balanceOf(owner_), "ERC721Enumerable: owner index out of bounds"); + if (index_ >= balanceOf(owner_)) revert OwnerIndexOutOfBounds(owner_, index_); return _getErc721Storage().ownedTokens[owner_][index_]; } @@ -122,7 +126,7 @@ abstract contract DiamondERC721Storage is * @notice This function allows you to retrieve the NFT token ID at a given `index` of all the tokens stored by the contract. */ function tokenByIndex(uint256 index_) public view virtual returns (uint256) { - require(index_ < totalSupply(), "ERC721Enumerable: global index out of bounds"); + if (index_ >= totalSupply()) revert IndexOutOfBounds(index_); return _getErc721Storage().allTokens[index_]; } @@ -133,7 +137,7 @@ abstract contract DiamondERC721Storage is function ownerOf(uint256 tokenId_) public view virtual override returns (address) { address owner = _ownerOf(tokenId_); - require(owner != address(0), "ERC721: invalid token ID"); + if (owner == address(0)) revert NonexistentToken(tokenId_); return owner; } @@ -168,7 +172,7 @@ abstract contract DiamondERC721Storage is * @notice The function that reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId_) internal view virtual { - require(_exists(tokenId_), "ERC721: invalid token ID"); + if (!_exists(tokenId_)) revert NonexistentToken(tokenId_); } /** diff --git a/contracts/diamond/utils/InitializableStorage.sol b/contracts/diamond/utils/InitializableStorage.sol index fa8736f2..e010cfba 100644 --- a/contracts/diamond/utils/InitializableStorage.sol +++ b/contracts/diamond/utils/InitializableStorage.sol @@ -18,6 +18,10 @@ abstract contract InitializableStorage { event Initialized(bytes32 storageSlot); + error AlreadyInitialized(); + error InvalidInitialization(); + error NotInitializing(); + /** * @dev A modifier that defines a protected initializer function that can be invoked at most * once for a particular storage in a Diamond proxy that begins with {storageSlot_}. @@ -28,7 +32,7 @@ abstract contract InitializableStorage { modifier initializer(bytes32 storageSlot_) { uint8 initializing_ = _getInitializing(storageSlot_); - require(initializing_ == 0, "Initializable: contract is already initialized"); + if (initializing_ != 0) revert AlreadyInitialized(); _setInitializing(storageSlot_, 1); _; @@ -42,10 +46,7 @@ abstract contract InitializableStorage { * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing(bytes32 storageSlot_) { - require( - _getInitializing(storageSlot_) == 1, - "Initializable: contract is not initializing" - ); + if (_getInitializing(storageSlot_) != 1) revert NotInitializing(); _; } @@ -66,7 +67,7 @@ abstract contract InitializableStorage { function _disableInitializers(bytes32 storageSlot_) internal virtual { uint8 initializing_ = _getInitializing(storageSlot_); - require(initializing_ == 0, "Initializable: contract is initializing"); + if (initializing_ != 0) revert InvalidInitialization(); _setInitializing(storageSlot_, 2); diff --git a/contracts/finance/compound-rate-keeper/AbstractCompoundRateKeeper.sol b/contracts/finance/compound-rate-keeper/AbstractCompoundRateKeeper.sol index 33af30c8..e62f0b09 100644 --- a/contracts/finance/compound-rate-keeper/AbstractCompoundRateKeeper.sol +++ b/contracts/finance/compound-rate-keeper/AbstractCompoundRateKeeper.sol @@ -37,6 +37,10 @@ abstract contract AbstractCompoundRateKeeper is ICompoundRateKeeper, Initializab uint256 private _currentRate; + error CapitalizationPeriodIsZero(); + error MaxRateIsReached(); + error RateIsLessThanOne(uint256 rate); + /** * @notice The initialization function */ @@ -177,7 +181,7 @@ abstract contract AbstractCompoundRateKeeper is ICompoundRateKeeper, Initializab * @notice The private function to update the compound rate */ function _update() private { - require(!_isMaxRateReached, "CRK: max rate is reached"); + if (_isMaxRateReached) revert MaxRateIsReached(); _currentRate = getCompoundRate(); _lastUpdate = uint64(block.timestamp); @@ -187,7 +191,7 @@ abstract contract AbstractCompoundRateKeeper is ICompoundRateKeeper, Initializab * @notice The private function that changes to capitalization rate */ function _changeCapitalizationRate(uint256 capitalizationRate_) private { - require(capitalizationRate_ >= PRECISION, "CRK: rate is less than 1"); + if (capitalizationRate_ < PRECISION) revert RateIsLessThanOne(capitalizationRate_); _capitalizationRate = capitalizationRate_; @@ -198,7 +202,7 @@ abstract contract AbstractCompoundRateKeeper is ICompoundRateKeeper, Initializab * @notice The private function that changes to capitalization period */ function _changeCapitalizationPeriod(uint64 capitalizationPeriod_) private { - require(capitalizationPeriod_ > 0, "CRK: invalid period"); + if (capitalizationPeriod_ == 0) revert CapitalizationPeriodIsZero(); _capitalizationPeriod = capitalizationPeriod_; diff --git a/contracts/finance/compound-rate-keeper/presets/OwnableCompoundRateKeeper.sol b/contracts/finance/compound-rate-keeper/presets/OwnableCompoundRateKeeper.sol index 75655395..0a93f4e9 100644 --- a/contracts/finance/compound-rate-keeper/presets/OwnableCompoundRateKeeper.sol +++ b/contracts/finance/compound-rate-keeper/presets/OwnableCompoundRateKeeper.sol @@ -18,7 +18,7 @@ contract OwnableCompoundRateKeeper is AbstractCompoundRateKeeper, OwnableUpgrade uint256 capitalizationRate_, uint64 capitalizationPeriod_ ) public initializer { - __Ownable_init(); + __Ownable_init(msg.sender); __CompoundRateKeeper_init(capitalizationRate_, capitalizationPeriod_); } diff --git a/contracts/finance/staking/AbstractStaking.sol b/contracts/finance/staking/AbstractStaking.sol index 65480438..1168dc1e 100644 --- a/contracts/finance/staking/AbstractStaking.sol +++ b/contracts/finance/staking/AbstractStaking.sol @@ -31,6 +31,10 @@ abstract contract AbstractStaking is AbstractValueDistributor, Initializable { uint256 private _stakingStartTime; + error RewardsTokenIsZeroAddress(); + error SharesTokenIsZeroAddress(); + error StakingHasNotStarted(uint256 currentTimestamp, uint256 stakingStartTime); + /** * @dev Throws if the staking has not started yet. */ @@ -56,8 +60,8 @@ abstract contract AbstractStaking is AbstractValueDistributor, Initializable { uint256 rate_, uint256 stakingStartTime_ ) internal onlyInitializing { - require(sharesToken_ != address(0), "Staking: zero address cannot be the Shares Token"); - require(rewardsToken_ != address(0), "Staking: zero address cannot be the Rewards Token"); + if (sharesToken_ == address(0)) revert SharesTokenIsZeroAddress(); + if (rewardsToken_ == address(0)) revert RewardsTokenIsZeroAddress(); _sharesToken = sharesToken_; _rewardsToken = rewardsToken_; @@ -197,7 +201,8 @@ abstract contract AbstractStaking is AbstractValueDistributor, Initializable { * @dev Throws if the staking has not started yet. */ function _checkStakingStarted() internal view { - require(block.timestamp >= _stakingStartTime, "Staking: staking has not started yet"); + if (block.timestamp < _stakingStartTime) + revert StakingHasNotStarted(block.timestamp, _stakingStartTime); } /** diff --git a/contracts/finance/staking/AbstractValueDistributor.sol b/contracts/finance/staking/AbstractValueDistributor.sol index 9a0436f6..40c41588 100644 --- a/contracts/finance/staking/AbstractValueDistributor.sol +++ b/contracts/finance/staking/AbstractValueDistributor.sol @@ -34,6 +34,11 @@ abstract contract AbstractValueDistributor { event SharesRemoved(address user, uint256 amount); event ValueDistributed(address user, uint256 amount); + error AmountIsZero(); + error InsufficientOwedValue(address account, uint256 balance, uint256 needed); + error InsufficientSharesAmount(address account, uint256 balance, uint256 needed); + error UserIsZeroAddress(); + /** * @notice Returns the total number of shares. * @return The total number of shares. @@ -88,8 +93,8 @@ abstract contract AbstractValueDistributor { * @param amount_ The amount of shares to add. */ function _addShares(address user_, uint256 amount_) internal virtual { - require(user_ != address(0), "ValueDistributor: zero address is not allowed"); - require(amount_ > 0, "ValueDistributor: amount has to be more than 0"); + if (user_ == address(0)) revert UserIsZeroAddress(); + if (amount_ == 0) revert AmountIsZero(); _update(user_); @@ -109,8 +114,9 @@ abstract contract AbstractValueDistributor { function _removeShares(address user_, uint256 amount_) internal virtual { UserDistribution storage _userDist = _userDistributions[user_]; - require(amount_ > 0, "ValueDistributor: amount has to be more than 0"); - require(amount_ <= _userDist.shares, "ValueDistributor: insufficient amount"); + if (amount_ == 0) revert AmountIsZero(); + if (amount_ > _userDist.shares) + revert InsufficientSharesAmount(user_, _userDist.shares, amount_); _update(user_); @@ -132,8 +138,9 @@ abstract contract AbstractValueDistributor { UserDistribution storage _userDist = _userDistributions[user_]; - require(amount_ > 0, "ValueDistributor: amount has to be more than 0"); - require(amount_ <= _userDist.owedValue, "ValueDistributor: insufficient amount"); + if (amount_ == 0) revert AmountIsZero(); + if (amount_ > _userDist.owedValue) + revert InsufficientOwedValue(user_, _userDist.owedValue, amount_); _userDist.owedValue -= amount_; @@ -154,7 +161,7 @@ abstract contract AbstractValueDistributor { uint256 amount_ = _userDist.owedValue; - require(amount_ > 0, "ValueDistributor: amount has to be more than 0"); + if (amount_ == 0) revert AmountIsZero(); delete _userDist.owedValue; diff --git a/contracts/finance/vesting/Vesting.sol b/contracts/finance/vesting/Vesting.sol index f6c8ad58..8a26fae4 100644 --- a/contracts/finance/vesting/Vesting.sol +++ b/contracts/finance/vesting/Vesting.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.4; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import {MathUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol"; import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {PRECISION} from "../../utils/Globals.sol"; @@ -69,7 +69,7 @@ import {PRECISION} from "../../utils/Globals.sol"; * It's not possible to create a schedule with an exponent equal to 0. */ abstract contract Vesting is Initializable { - using MathUpgradeable for uint256; + using Math for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.UintSet; @@ -135,6 +135,17 @@ abstract contract Vesting is Initializable { */ event WithdrawnFromVesting(uint256 indexed vestingId, uint256 amount); + error BeneficiaryIsZeroAddress(); + error ExponentIsZero(); + error NothingToWithdraw(); + error StartTimeIsZero(); + error ScheduleInvalidPeriodParameter(uint256 durationInPeriods, uint256 secondsInPeriod); + error ScheduleCliffGreaterThanDuration(uint256 cliffInPeriods, uint256 durationInPeriods); + error UnauthorizedAccount(address account); + error VestingAmountIsZero(); + error VestingTokenIsZeroAddress(); + error VestingPastDate(); + /** * @notice Constructor. */ @@ -147,14 +158,8 @@ abstract contract Vesting is Initializable { function withdrawFromVesting(uint256 vestingId_) public virtual { VestingData storage _vesting = _vestings[vestingId_]; - require( - msg.sender == _vesting.beneficiary, - "VestingWallet: only beneficiary can withdraw from his vesting" - ); - require( - _vesting.paidAmount < _vesting.vestingAmount, - "VestingWallet: nothing to withdraw" - ); + if (msg.sender != _vesting.beneficiary) revert UnauthorizedAccount(msg.sender); + if (_vesting.paidAmount >= _vesting.vestingAmount) revert NothingToWithdraw(); uint256 amountToPay_ = getWithdrawableAmount(vestingId_); address token_ = _vesting.vestingToken; @@ -258,10 +263,7 @@ abstract contract Vesting is Initializable { * @return The ID of the created schedule. */ function _createSchedule(Schedule memory schedule_) internal virtual returns (uint256) { - require( - schedule_.exponent > 0, - "VestingWallet: cannot create schedule with zero exponent" - ); + if (schedule_.exponent == 0) revert ExponentIsZero(); _validateSchedule(schedule_.scheduleData); @@ -282,13 +284,12 @@ abstract contract Vesting is Initializable { Schedule storage _schedule = _schedules[vesting_.scheduleId]; - require( + if ( vesting_.vestingStartTime + _schedule.scheduleData.durationInPeriods * - _schedule.scheduleData.secondsInPeriod > - block.timestamp, - "VestingWallet: cannot create vesting for a past date" - ); + _schedule.scheduleData.secondsInPeriod <= + block.timestamp + ) revert VestingPastDate(); uint256 _currentVestingId = ++vestingId; @@ -409,14 +410,16 @@ abstract contract Vesting is Initializable { * @param schedule_ Base schedule data to be validated. */ function _validateSchedule(BaseSchedule memory schedule_) internal pure { - require( - schedule_.durationInPeriods > 0 && schedule_.secondsInPeriod > 0, - "VestingWallet: cannot create schedule with zero duration or zero seconds in period" - ); - require( - schedule_.cliffInPeriods < schedule_.durationInPeriods, - "VestingWallet: cliff cannot be greater than duration" - ); + if (schedule_.durationInPeriods == 0 || schedule_.secondsInPeriod == 0) + revert ScheduleInvalidPeriodParameter( + schedule_.durationInPeriods, + schedule_.secondsInPeriod + ); + if (schedule_.cliffInPeriods >= schedule_.durationInPeriods) + revert ScheduleCliffGreaterThanDuration( + schedule_.cliffInPeriods, + schedule_.durationInPeriods + ); } /** @@ -424,22 +427,10 @@ abstract contract Vesting is Initializable { * @param vesting_ Vesting data to be validated. */ function _validateVesting(VestingData memory vesting_) internal pure { - require( - vesting_.vestingStartTime > 0, - "VestingWallet: cannot create vesting for zero time" - ); - require( - vesting_.vestingAmount > 0, - "VestingWallet: cannot create vesting for zero amount" - ); - require( - vesting_.beneficiary != address(0), - "VestingWallet: cannot create vesting for zero address" - ); - require( - vesting_.vestingToken != address(0), - "VestingWallet: vesting token cannot be zero address" - ); + if (vesting_.vestingStartTime == 0) revert StartTimeIsZero(); + if (vesting_.vestingAmount == 0) revert VestingAmountIsZero(); + if (vesting_.beneficiary == address(0)) revert BeneficiaryIsZeroAddress(); + if (vesting_.vestingToken == address(0)) revert VestingTokenIsZeroAddress(); } /** diff --git a/contracts/interfaces/proxy/IAdminableProxy.sol b/contracts/interfaces/proxy/IAdminableProxy.sol new file mode 100644 index 00000000..4383f72b --- /dev/null +++ b/contracts/interfaces/proxy/IAdminableProxy.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import {IERC1967} from "@openzeppelin/contracts/interfaces/IERC1967.sol"; + +/** + * @notice The proxies module + * + * Interface for AdminableProxy. + **/ +interface IAdminableProxy is IERC1967 { + /** + * @notice The function to upgrade the implementation contract with additional setup call if data is nonempty. + */ + function upgradeToAndCall(address, bytes calldata) external payable; + + /** + * @notice The function to return the current implementation address. + */ + function implementation() external view returns (address); +} diff --git a/contracts/libs/arrays/ArrayHelper.sol b/contracts/libs/arrays/ArrayHelper.sol index 44127484..80337b3a 100644 --- a/contracts/libs/arrays/ArrayHelper.sol +++ b/contracts/libs/arrays/ArrayHelper.sol @@ -7,6 +7,8 @@ import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; * @notice A simple library to work with arrays */ library ArrayHelper { + error InvalidRange(uint256 beginIndex, uint256 endIndex); + /** * @notice The function that searches for the index of the first occurring element, which is * greater than or equal to the `element_`. The time complexity is O(log n) @@ -97,7 +99,7 @@ library ArrayHelper { uint256 beginIndex_, uint256 endIndex_ ) internal view returns (uint256) { - require(beginIndex_ <= endIndex_, "ArrayHelper: wrong range"); + if (beginIndex_ > endIndex_) revert InvalidRange(beginIndex_, endIndex_); if (beginIndex_ == 0) { return prefixes[endIndex_]; diff --git a/contracts/libs/arrays/SetHelper.sol b/contracts/libs/arrays/SetHelper.sol index 6b7fcca0..c505c167 100644 --- a/contracts/libs/arrays/SetHelper.sol +++ b/contracts/libs/arrays/SetHelper.sol @@ -14,6 +14,18 @@ library SetHelper { using EnumerableSet for EnumerableSet.Bytes32Set; using DynamicSet for *; + error ElementAlreadyExistsAddress(address element); + error ElementAlreadyExistsUint256(uint256 element); + error ElementAlreadyExistsBytes32(bytes32 element); + error ElementAlreadyExistsBytes(bytes element); + error ElementAlreadyExistsString(string element); + + error NoSuchAddress(address element); + error NoSuchUint256(uint256 element); + error NoSuchBytes32(bytes32 element); + error NoSuchBytes(bytes element); + error NoSuchString(string element); + /** * @notice The function to insert an array of elements into the address set * @param set the set to insert the elements into @@ -68,7 +80,7 @@ library SetHelper { */ function strictAdd(EnumerableSet.AddressSet storage set, address[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.add(array_[i]), "SetHelper: element already exists"); + if (!set.add(array_[i])) revert ElementAlreadyExistsAddress(array_[i]); } } @@ -77,7 +89,7 @@ library SetHelper { */ function strictAdd(EnumerableSet.UintSet storage set, uint256[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.add(array_[i]), "SetHelper: element already exists"); + if (!set.add(array_[i])) revert ElementAlreadyExistsUint256(array_[i]); } } @@ -86,7 +98,7 @@ library SetHelper { */ function strictAdd(EnumerableSet.Bytes32Set storage set, bytes32[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.add(array_[i]), "SetHelper: element already exists"); + if (!set.add(array_[i])) revert ElementAlreadyExistsBytes32(array_[i]); } } @@ -95,7 +107,7 @@ library SetHelper { */ function strictAdd(DynamicSet.BytesSet storage set, bytes[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.add(array_[i]), "SetHelper: element already exists"); + if (!set.add(array_[i])) revert ElementAlreadyExistsBytes(array_[i]); } } @@ -104,7 +116,7 @@ library SetHelper { */ function strictAdd(DynamicSet.StringSet storage set, string[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.add(array_[i]), "SetHelper: element already exists"); + if (!set.add(array_[i])) revert ElementAlreadyExistsString(array_[i]); } } @@ -162,7 +174,7 @@ library SetHelper { */ function strictRemove(EnumerableSet.AddressSet storage set, address[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.remove(array_[i]), "SetHelper: no such element"); + if (!set.remove(array_[i])) revert NoSuchAddress(array_[i]); } } @@ -171,7 +183,7 @@ library SetHelper { */ function strictRemove(EnumerableSet.UintSet storage set, uint256[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.remove(array_[i]), "SetHelper: no such element"); + if (!set.remove(array_[i])) revert NoSuchUint256(array_[i]); } } @@ -180,7 +192,7 @@ library SetHelper { */ function strictRemove(EnumerableSet.Bytes32Set storage set, bytes32[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.remove(array_[i]), "SetHelper: no such element"); + if (!set.remove(array_[i])) revert NoSuchBytes32(array_[i]); } } @@ -189,7 +201,7 @@ library SetHelper { */ function strictRemove(DynamicSet.BytesSet storage set, bytes[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.remove(array_[i]), "SetHelper: no such element"); + if (!set.remove(array_[i])) revert NoSuchBytes(array_[i]); } } @@ -198,7 +210,7 @@ library SetHelper { */ function strictRemove(DynamicSet.StringSet storage set, string[] memory array_) internal { for (uint256 i = 0; i < array_.length; i++) { - require(set.remove(array_[i]), "SetHelper: no such element"); + if (!set.remove(array_[i])) revert NoSuchString(array_[i]); } } } diff --git a/contracts/libs/data-structures/AvlTree.sol b/contracts/libs/data-structures/AvlTree.sol index 1c0c04d8..26268213 100644 --- a/contracts/libs/data-structures/AvlTree.sol +++ b/contracts/libs/data-structures/AvlTree.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; +// solhint-disable-previous-line one-contract-per-file import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; @@ -66,6 +67,11 @@ library AvlTree { Tree _tree; } + error NodeAlreadyExists(bytes32 key); + error NodeDoesNotExist(bytes32 key); + error KeyIsZero(); + error TreeNotEmpty(); + /** * @notice The function to set a custom comparator function, that will be used to build the uint256 tree. * @param tree self. @@ -424,7 +430,7 @@ library AvlTree { Tree storage tree, function(bytes32, bytes32) view returns (int256) comparator_ ) private { - require(_size(tree) == 0, "AvlTree: the tree must be empty"); + if (_size(tree) != 0) revert TreeNotEmpty(); tree.isCustomComparatorSet = true; @@ -432,7 +438,7 @@ library AvlTree { } function _insert(Tree storage tree, bytes32 key_, bytes32 value_) private { - require(key_ != 0, "AvlTree: key is not allowed to be 0"); + if (key_ == 0) revert KeyIsZero(); tree.totalCount++; @@ -448,7 +454,7 @@ library AvlTree { } function _remove(Tree storage tree, bytes32 key_) private { - require(key_ != 0, "AvlTree: key is not allowed to be 0"); + if (key_ == 0) revert KeyIsZero(); tree.root = _removeNode(tree.tree, tree.root, 0, bytes32(key_), _getComparator(tree)); @@ -490,7 +496,7 @@ library AvlTree { comparator_ ); } else if (comparison_ == 0) { - revert("AvlTree: the node already exists"); + revert NodeAlreadyExists(key_); } else { _tree[node_].right = _insertNode( _tree, @@ -513,7 +519,7 @@ library AvlTree { bytes32 key_, function(bytes32, bytes32) view returns (int256) comparator_ ) private returns (uint64) { - require(node_ != 0, "AvlTree: the node doesn't exist"); + if (node_ == 0) revert NodeDoesNotExist(key_); int256 comparison_ = comparator_(key_, _tree[node_].key); @@ -683,7 +689,7 @@ library AvlTree { function _get(Tree storage tree, bytes32 key_) private view returns (bytes32) { uint64 index_ = _search(tree.tree, tree.root, key_, _getComparator(tree)); - require(index_ != 0, "AvlTree: the node doesn't exist"); + if (index_ == 0) revert NodeDoesNotExist(key_); return tree.tree[index_].value; } @@ -765,6 +771,8 @@ library Traversal { uint64 currentNode; } + error NoNodesLeft(); + /** * @notice The function to check if the iterator is currently valid (has not reached the end of the traversal). * @param iterator_ self. @@ -853,7 +861,7 @@ library Traversal { ) internal view returns (bytes32, bytes32) { uint64 currentNodeIndex_ = iterator_.currentNode; - require(currentNodeIndex_ != 0, "Traversal: no more nodes"); + if (currentNodeIndex_ == 0) revert NoNodesLeft(); AvlTree.Node memory node_ = _getNode(iterator_.treeMappingSlot, currentNodeIndex_); diff --git a/contracts/libs/data-structures/IncrementalMerkleTree.sol b/contracts/libs/data-structures/IncrementalMerkleTree.sol index 808869eb..04b9f557 100644 --- a/contracts/libs/data-structures/IncrementalMerkleTree.sol +++ b/contracts/libs/data-structures/IncrementalMerkleTree.sol @@ -57,6 +57,10 @@ library IncrementalMerkleTree { IMT _tree; } + error NewHeightMustBeGreater(uint256 currentHeight, uint256 newHeight); + error TreeIsNotEmpty(); + error TreeIsFull(); + /** * @notice The function to set the height of the uint256 tree. * Complexity is O(1). @@ -301,10 +305,9 @@ library IncrementalMerkleTree { } function _setHeight(IMT storage tree, uint256 height_) private { - require( - height_ > _height(tree), - "IncrementalMerkleTree: the height must be greater than the current one" - ); + uint256 currentHeight_ = _height(tree); + + if (height_ <= currentHeight_) revert NewHeightMustBeGreater(currentHeight_, height_); tree.isStrictHeightSet = true; @@ -318,7 +321,7 @@ library IncrementalMerkleTree { function(bytes32) view returns (bytes32) hash1_, function(bytes32, bytes32) view returns (bytes32) hash2_ ) private { - require(_length(tree) == 0, "IncrementalMerkleTree: the tree must be empty"); + if (_length(tree) != 0) revert TreeIsNotEmpty(); tree.isCustomHasherSet = true; @@ -353,9 +356,7 @@ library IncrementalMerkleTree { } if (index_ == treeHeight_) { - if (tree.isStrictHeightSet) { - revert("IncrementalMerkleTree: the tree is full"); - } + if (tree.isStrictHeightSet) revert TreeIsFull(); tree.branches.push(resultValue_); } else { diff --git a/contracts/libs/data-structures/PriorityQueue.sol b/contracts/libs/data-structures/PriorityQueue.sol index 2eeb8636..00789999 100644 --- a/contracts/libs/data-structures/PriorityQueue.sol +++ b/contracts/libs/data-structures/PriorityQueue.sol @@ -40,6 +40,8 @@ library PriorityQueue { Queue _queue; } + error QueueIsEmpty(); + /** * @notice The function to add an element to the uint256 queue. O(log(n)) complex * @param queue self @@ -368,6 +370,6 @@ library PriorityQueue { } function _requireNotEmpty(Queue storage queue) private view { - require(_length(queue) > 0, "PriorityQueue: empty queue"); + if (_length(queue) == 0) revert QueueIsEmpty(); } } diff --git a/contracts/libs/data-structures/SparseMerkleTree.sol b/contracts/libs/data-structures/SparseMerkleTree.sol index d5acf940..ab61c962 100644 --- a/contracts/libs/data-structures/SparseMerkleTree.sol +++ b/contracts/libs/data-structures/SparseMerkleTree.sol @@ -71,6 +71,17 @@ library SparseMerkleTree { SMT _tree; } + error KeyAlreadyExists(bytes32 key); + error LeafDoesNotMatch(bytes32 currentKey, bytes32 key); + error MaxDepthExceedsHardCap(uint32 maxDepth); + error MaxDepthIsZero(); + error MaxDepthReached(); + error NewMaxDepthMustBeLarger(uint32 currentDepth, uint32 newDepth); + error NodeDoesNotExist(uint256 nodeId); + error TreeAlreadyInitialized(); + error TreeNotInitialized(); + error TreeIsNotEmpty(); + /** * @notice The function to initialize the Merkle tree. * Under the hood it sets the maximum depth of the Merkle tree, therefore can be considered @@ -679,23 +690,23 @@ library SparseMerkleTree { } modifier onlyInitialized(SMT storage tree) { - require(_isInitialized(tree), "SparseMerkleTree: tree is not initialized"); + if (!_isInitialized(tree)) revert TreeNotInitialized(); _; } function _initialize(SMT storage tree, uint32 maxDepth_) private { - require(!_isInitialized(tree), "SparseMerkleTree: tree is already initialized"); + if (_isInitialized(tree)) revert TreeAlreadyInitialized(); _setMaxDepth(tree, maxDepth_); } function _setMaxDepth(SMT storage tree, uint32 maxDepth_) private { - require(maxDepth_ > 0, "SparseMerkleTree: max depth must be greater than zero"); - require(maxDepth_ > tree.maxDepth, "SparseMerkleTree: max depth can only be increased"); - require( - maxDepth_ <= MAX_DEPTH_HARD_CAP, - "SparseMerkleTree: max depth is greater than hard cap" - ); + if (maxDepth_ == 0) revert MaxDepthIsZero(); + + uint32 currentDepth_ = tree.maxDepth; + + if (maxDepth_ <= currentDepth_) revert NewMaxDepthMustBeLarger(currentDepth_, maxDepth_); + if (maxDepth_ > MAX_DEPTH_HARD_CAP) revert MaxDepthExceedsHardCap(maxDepth_); tree.maxDepth = maxDepth_; } @@ -705,7 +716,7 @@ library SparseMerkleTree { function(bytes32, bytes32) view returns (bytes32) hash2_, function(bytes32, bytes32, bytes32) view returns (bytes32) hash3_ ) private { - require(_nodesCount(tree) == 0, "SparseMerkleTree: tree is not empty"); + if (_nodesCount(tree) != 0) revert TreeIsNotEmpty(); tree.isCustomHasherSet = true; @@ -764,9 +775,7 @@ library SparseMerkleTree { if (currentNode_.nodeType == NodeType.EMPTY) { return _setNode(tree, newLeaf_); } else if (currentNode_.nodeType == NodeType.LEAF) { - if (currentNode_.key == newLeaf_.key) { - revert("SparseMerkleTree: the key already exists"); - } + if (currentNode_.key == newLeaf_.key) revert KeyAlreadyExists(newLeaf_.key); return _pushLeaf(tree, newLeaf_, currentNode_, nodeId_, currentDepth_); } else { @@ -797,11 +806,9 @@ library SparseMerkleTree { Node memory currentNode_ = tree.nodes[nodeId_]; if (currentNode_.nodeType == NodeType.EMPTY) { - revert("SparseMerkleTree: the node does not exist"); + revert NodeDoesNotExist(nodeId_); } else if (currentNode_.nodeType == NodeType.LEAF) { - if (currentNode_.key != key_) { - revert("SparseMerkleTree: the leaf does not match"); - } + if (currentNode_.key != key_) revert LeafDoesNotMatch(currentNode_.key, key_); _deleteNode(tree, nodeId_); @@ -865,11 +872,10 @@ library SparseMerkleTree { Node memory currentNode_ = tree.nodes[nodeId_]; if (currentNode_.nodeType == NodeType.EMPTY) { - revert("SparseMerkleTree: the node does not exist"); + revert NodeDoesNotExist(nodeId_); } else if (currentNode_.nodeType == NodeType.LEAF) { - if (currentNode_.key != newLeaf_.key) { - revert("SparseMerkleTree: the leaf does not match"); - } + if (currentNode_.key != newLeaf_.key) + revert LeafDoesNotMatch(currentNode_.key, newLeaf_.key); tree.nodes[nodeId_] = newLeaf_; currentNode_ = newLeaf_; @@ -891,7 +897,7 @@ library SparseMerkleTree { uint256 oldLeafId_, uint16 currentDepth_ ) private returns (uint256) { - require(currentDepth_ < tree.maxDepth, "SparseMerkleTree: max depth reached"); + if (currentDepth_ >= tree.maxDepth) revert MaxDepthReached(); Node memory newNodeMiddle_; bool newLeafBitAtDepth_ = (uint256(newLeaf_.key) >> currentDepth_) & 1 == 1; diff --git a/contracts/libs/data-structures/memory/Vector.sol b/contracts/libs/data-structures/memory/Vector.sol index f8c85301..582d2dad 100644 --- a/contracts/libs/data-structures/memory/Vector.sol +++ b/contracts/libs/data-structures/memory/Vector.sol @@ -42,6 +42,9 @@ library Vector { Vector _vector; } + error IndexOutOfBounds(uint256 index, uint256 vectorLength); + error PopEmptyVector(); + /** * @notice The UintVector constructor, creates an empty vector instance, O(1) complex * @return vector the newly created instance @@ -367,7 +370,7 @@ library Vector { function _pop(Vector memory vector) private pure { uint256 length_ = _length(vector); - require(length_ > 0, "Vector: empty vector"); + if (length_ == 0) revert PopEmptyVector(); assembly { mstore(mload(add(vector, 0x20)), sub(length_, 0x1)) @@ -423,7 +426,7 @@ library Vector { } function _requireInBounds(Vector memory vector, uint256 index_) private pure { - require(index_ < _length(vector), "Vector: out of bounds"); + if (index_ >= _length(vector)) revert IndexOutOfBounds(index_, _length(vector)); } function _clean(uint256 dataPointer_, uint256 slots_) private pure { diff --git a/contracts/libs/utils/DecimalsConverter.sol b/contracts/libs/utils/DecimalsConverter.sol index 51b1e8e2..0631f7bf 100644 --- a/contracts/libs/utils/DecimalsConverter.sol +++ b/contracts/libs/utils/DecimalsConverter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; -import {ERC20, IERC20, IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; /** * @notice This library is used to convert numbers that use token's N decimals to M decimals. @@ -36,6 +36,8 @@ import {ERC20, IERC20, IERC20Metadata} from "@openzeppelin/contracts/token/ERC20 * ``` */ library DecimalsConverter { + error ConversionFailed(); + /** * @notice The function to get the decimals of ERC20 token. Needed for bytecode optimization * @param token_ the ERC20 token @@ -234,7 +236,7 @@ library DecimalsConverter { } function _safe(uint256 amount_) private pure returns (uint256) { - require(amount_ > 0, "DecimalsConverter: conversion failed"); + if (amount_ == 0) revert ConversionFailed(); return amount_; } diff --git a/contracts/libs/zkp/snarkjs/VerifierHelper.sol b/contracts/libs/zkp/VerifierHelper.sol similarity index 92% rename from contracts/libs/zkp/snarkjs/VerifierHelper.sol rename to contracts/libs/zkp/VerifierHelper.sol index 422b8f03..5997d1bb 100644 --- a/contracts/libs/zkp/snarkjs/VerifierHelper.sol +++ b/contracts/libs/zkp/VerifierHelper.sol @@ -23,6 +23,9 @@ library VerifierHelper { uint256[2] c; } + error InvalidPublicSignalsCount(uint256 arrayLength, uint256 pubSignalsCount); + error FailedToCallVerifyProof(); + /** * @notice Function to call the `verifyProof` function on the `verifier` contract. * The ZK proof points are wrapped in a structure for convenience @@ -82,10 +85,8 @@ library VerifierHelper { ProofPoints memory proofPoints_, uint256 pubSignalsCount_ ) internal view returns (bool) { - require( - pubSignals_.length == pubSignalsCount_, - "VerifierHelper: invalid public signals count" - ); + if (pubSignals_.length != pubSignalsCount_) + revert InvalidPublicSignalsCount(pubSignals_.length, pubSignalsCount_); return _verifyProof( @@ -117,10 +118,8 @@ library VerifierHelper { uint256[2] memory c_, uint256 pubSignalsCount_ ) internal view returns (bool) { - require( - pubSignals_.length == pubSignalsCount_, - "VerifierHelper: invalid public signals count" - ); + if (pubSignals_.length != pubSignalsCount_) + revert InvalidPublicSignalsCount(pubSignals_.length, pubSignalsCount_); return _verifyProof(verifier_, a_, b_, c_, pubSignals_, pubSignalsCount_); } @@ -146,7 +145,7 @@ library VerifierHelper { abi.encodePacked(abi.encodeWithSignature(funcSign_, a_, b_, c_), pubSignals_) ); - require(success_, "VerifierHelper: failed to call verifyProof function"); + if (!success_) revert FailedToCallVerifyProof(); return abi.decode(returnData_, (bool)); } diff --git a/contracts/mock/access/MerkleWhitelistedMock.sol b/contracts/mock/access/MerkleWhitelistedMock.sol index 16f3d87d..8b0401a0 100644 --- a/contracts/mock/access/MerkleWhitelistedMock.sol +++ b/contracts/mock/access/MerkleWhitelistedMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {MerkleWhitelisted} from "../../access/MerkleWhitelisted.sol"; diff --git a/contracts/mock/access/MultiOwnableMock.sol b/contracts/mock/access/MultiOwnableMock.sol index 08899701..ae4b6c6e 100644 --- a/contracts/mock/access/MultiOwnableMock.sol +++ b/contracts/mock/access/MultiOwnableMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {MultiOwnable} from "./../../access/MultiOwnable.sol"; diff --git a/contracts/mock/access/PermanentOwnableMock.sol b/contracts/mock/access/PermanentOwnableMock.sol index 36ef1f45..c214445b 100644 --- a/contracts/mock/access/PermanentOwnableMock.sol +++ b/contracts/mock/access/PermanentOwnableMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {PermanentOwnable} from "../../access/PermanentOwnable.sol"; diff --git a/contracts/mock/access/RBACMock.sol b/contracts/mock/access/RBACMock.sol index 713900e4..b38b482d 100644 --- a/contracts/mock/access/RBACMock.sol +++ b/contracts/mock/access/RBACMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {TypeCaster} from "../../libs/utils/TypeCaster.sol"; diff --git a/contracts/mock/access/extensions/RBACGroupableMock.sol b/contracts/mock/access/extensions/RBACGroupableMock.sol index 2e1ab826..c27e3c1a 100644 --- a/contracts/mock/access/extensions/RBACGroupableMock.sol +++ b/contracts/mock/access/extensions/RBACGroupableMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {TypeCaster} from "../../../libs/utils/TypeCaster.sol"; diff --git a/contracts/mock/contracts-registry/ContractsRegistryMock.sol b/contracts/mock/contracts-registry/ContractsRegistryMock.sol index da9c6b35..efbf8467 100644 --- a/contracts/mock/contracts-registry/ContractsRegistryMock.sol +++ b/contracts/mock/contracts-registry/ContractsRegistryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {OwnableContractsRegistry} from "../../contracts-registry/presets/OwnableContractsRegistry.sol"; diff --git a/contracts/mock/contracts-registry/DependantMock.sol b/contracts/mock/contracts-registry/DependantMock.sol index c67e9cc4..99d9e526 100644 --- a/contracts/mock/contracts-registry/DependantMock.sol +++ b/contracts/mock/contracts-registry/DependantMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {AbstractDependant} from "../../contracts-registry/AbstractDependant.sol"; diff --git a/contracts/mock/contracts-registry/DependantUpgradeMock.sol b/contracts/mock/contracts-registry/DependantUpgradeMock.sol index 5fe3d7b4..ed3a7fb9 100644 --- a/contracts/mock/contracts-registry/DependantUpgradeMock.sol +++ b/contracts/mock/contracts-registry/DependantUpgradeMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DependantMock} from "./DependantMock.sol"; diff --git a/contracts/mock/contracts-registry/pools/ContractsRegistryPoolMock.sol b/contracts/mock/contracts-registry/pools/ContractsRegistryPoolMock.sol index 80155216..2597b4b9 100644 --- a/contracts/mock/contracts-registry/pools/ContractsRegistryPoolMock.sol +++ b/contracts/mock/contracts-registry/pools/ContractsRegistryPoolMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {OwnableContractsRegistry} from "../../../contracts-registry/presets/OwnableContractsRegistry.sol"; diff --git a/contracts/mock/contracts-registry/pools/PoolContractsRegistryMock.sol b/contracts/mock/contracts-registry/pools/PoolContractsRegistryMock.sol index d9cf5924..559bc60f 100644 --- a/contracts/mock/contracts-registry/pools/PoolContractsRegistryMock.sol +++ b/contracts/mock/contracts-registry/pools/PoolContractsRegistryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {ContractsRegistryPoolMock} from "./ContractsRegistryPoolMock.sol"; @@ -11,8 +12,10 @@ contract PoolContractsRegistryMock is OwnablePoolContractsRegistry { address internal _poolFactory; + error CallerNotAFactory(address caller, address factory); + modifier onlyPoolFactory() { - require(_poolFactory == msg.sender, "PoolContractsRegistry: not a factory"); + if (_poolFactory != msg.sender) revert CallerNotAFactory(msg.sender, _poolFactory); _; } diff --git a/contracts/mock/contracts-registry/pools/PoolMock.sol b/contracts/mock/contracts-registry/pools/PoolMock.sol index 8dddd9e6..4bbf782e 100644 --- a/contracts/mock/contracts-registry/pools/PoolMock.sol +++ b/contracts/mock/contracts-registry/pools/PoolMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {AbstractDependant} from "../../../contracts-registry/AbstractDependant.sol"; diff --git a/contracts/mock/contracts-registry/pools/PoolUpgradeMock.sol b/contracts/mock/contracts-registry/pools/PoolUpgradeMock.sol index c6957a7d..fea70c5b 100644 --- a/contracts/mock/contracts-registry/pools/PoolUpgradeMock.sol +++ b/contracts/mock/contracts-registry/pools/PoolUpgradeMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {PoolMock} from "./PoolMock.sol"; diff --git a/contracts/mock/contracts-registry/pools/pool-factory/PoolFactoryMock.sol b/contracts/mock/contracts-registry/pools/pool-factory/PoolFactoryMock.sol index 3709178e..aa6e51c4 100644 --- a/contracts/mock/contracts-registry/pools/pool-factory/PoolFactoryMock.sol +++ b/contracts/mock/contracts-registry/pools/pool-factory/PoolFactoryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {ContractsRegistryPoolMock} from "../ContractsRegistryPoolMock.sol"; diff --git a/contracts/mock/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistryMock.sol b/contracts/mock/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistryMock.sol index dc3690a2..993a64b1 100644 --- a/contracts/mock/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistryMock.sol +++ b/contracts/mock/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {MultiOwnablePoolContractsRegistry} from "../../../../contracts-registry/pools/presets/MultiOwnablePoolContractsRegistry.sol"; diff --git a/contracts/mock/diamond/DummyFacetMock.sol b/contracts/mock/diamond/DummyFacetMock.sol index 39825da8..20ca80eb 100644 --- a/contracts/mock/diamond/DummyFacetMock.sol +++ b/contracts/mock/diamond/DummyFacetMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DummyStorageMock} from "./DummyStorageMock.sol"; diff --git a/contracts/mock/diamond/DummyInitMock.sol b/contracts/mock/diamond/DummyInitMock.sol index 5289d476..69ff263f 100644 --- a/contracts/mock/diamond/DummyInitMock.sol +++ b/contracts/mock/diamond/DummyInitMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DummyFacetMock} from "./DummyFacetMock.sol"; @@ -6,6 +7,8 @@ import {DummyFacetMock} from "./DummyFacetMock.sol"; contract DummyInitMock is DummyFacetMock { event Initialized(); + error InitError(); + function init() external { setDummyString("dummy facet initialized"); emit Initialized(); @@ -16,6 +19,6 @@ contract DummyInitMock is DummyFacetMock { } function initWithErrorMsg() external pure { - revert("DiamondInit: init error"); + revert InitError(); } } diff --git a/contracts/mock/diamond/DummyStorageMock.sol b/contracts/mock/diamond/DummyStorageMock.sol index d4618656..3876a240 100644 --- a/contracts/mock/diamond/DummyStorageMock.sol +++ b/contracts/mock/diamond/DummyStorageMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; contract DummyStorageMock { diff --git a/contracts/mock/diamond/OwnableDiamondMock.sol b/contracts/mock/diamond/OwnableDiamondMock.sol index 5424a6da..b8eb18b9 100644 --- a/contracts/mock/diamond/OwnableDiamondMock.sol +++ b/contracts/mock/diamond/OwnableDiamondMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {OwnableDiamond} from "../../diamond/presets/OwnableDiamond.sol"; diff --git a/contracts/mock/diamond/access/DiamondAccessControlMock.sol b/contracts/mock/diamond/access/DiamondAccessControlMock.sol index eb12fe76..53d7c416 100644 --- a/contracts/mock/diamond/access/DiamondAccessControlMock.sol +++ b/contracts/mock/diamond/access/DiamondAccessControlMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DiamondAccessControl} from "../../../diamond/access/access-control/DiamondAccessControl.sol"; diff --git a/contracts/mock/diamond/tokens/DiamondERC20Mock.sol b/contracts/mock/diamond/tokens/DiamondERC20Mock.sol index aa2097e8..1b5d1ee7 100644 --- a/contracts/mock/diamond/tokens/DiamondERC20Mock.sol +++ b/contracts/mock/diamond/tokens/DiamondERC20Mock.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; -import "../../../diamond/tokens/ERC20/DiamondERC20.sol"; +import {DiamondERC20} from "../../../diamond/tokens/ERC20/DiamondERC20.sol"; contract DiamondERC20Mock is DiamondERC20 { constructor() { diff --git a/contracts/mock/diamond/tokens/DiamondERC721Mock.sol b/contracts/mock/diamond/tokens/DiamondERC721Mock.sol index c454e955..1e1a389a 100644 --- a/contracts/mock/diamond/tokens/DiamondERC721Mock.sol +++ b/contracts/mock/diamond/tokens/DiamondERC721Mock.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import {DiamondERC721} from "../../../diamond/tokens/ERC721/DiamondERC721.sol"; contract DiamondERC721Mock is DiamondERC721 { - string baseUri; - bool replaceOwner; + string internal baseUri; + bool internal replaceOwner; constructor() { _disableInitializers(DIAMOND_ERC721_STORAGE_SLOT); @@ -49,40 +49,42 @@ contract DiamondERC721Mock is DiamondERC721 { safeTransferFrom(from_, to_, tokenId_); } - function beforeTokenTransfer(uint256 batchSize) external { - _beforeTokenTransfer(address(this), address(this), 1, batchSize); + function update(uint256 batchSize_) external { + _update(address(this), 1, batchSize_); } function disableInitializers() external { _disableInitializers(DIAMOND_ERC721_STORAGE_SLOT); } - function _baseURI() internal view override returns (string memory) { - super._baseURI(); - return baseUri; - } - - function _beforeTokenTransfer( - address from_, + function _update( address to_, - uint256 firstTokenId_, + uint256 tokenId_, uint256 batchSize_ - ) internal override { + ) internal override returns (address) { if (replaceOwner) { - _getErc721Storage().owners[firstTokenId_] = address(this); + _getErc721Storage().owners[tokenId_] = address(this); + return address(this); } else { - super._beforeTokenTransfer(from_, to_, firstTokenId_, batchSize_); + return super._update(to_, tokenId_, batchSize_); } } + + function _baseURI() internal view override returns (string memory) { + super._baseURI(); + return baseUri; + } } contract NonERC721Receiver is IERC721Receiver { + error RevertingOnERC721Received(); + function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { - revert("ERC721Receiver: reverting onERC721Received"); + revert RevertingOnERC721Received(); } } diff --git a/contracts/mock/diamond/tokens/DiamondERC721NotReceiverMock.sol b/contracts/mock/diamond/tokens/DiamondERC721NotReceiverMock.sol new file mode 100644 index 00000000..c22c2910 --- /dev/null +++ b/contracts/mock/diamond/tokens/DiamondERC721NotReceiverMock.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.4; + +import {DiamondERC721Mock} from "./DiamondERC721Mock.sol"; + +contract DiamondERC721NotReceiverMock is DiamondERC721Mock { + function mockMint(address to_, uint256 tokenId_) external { + _mint(to_, tokenId_); + } + + function _checkOnERC721Received( + address, + address, + uint256, + bytes memory + ) internal pure override returns (bool) { + return false; + } +} diff --git a/contracts/mock/diamond/tokens/ERC721HolderMock.sol b/contracts/mock/diamond/tokens/ERC721HolderMock.sol new file mode 100644 index 00000000..0f9e049d --- /dev/null +++ b/contracts/mock/diamond/tokens/ERC721HolderMock.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.4; + +import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; + +contract ERC721HolderMock is ERC721Holder {} diff --git a/contracts/mock/finance/compound-rate-keeper/CompoundRateKeeperMock.sol b/contracts/mock/finance/compound-rate-keeper/CompoundRateKeeperMock.sol index 94373103..32daf8fd 100644 --- a/contracts/mock/finance/compound-rate-keeper/CompoundRateKeeperMock.sol +++ b/contracts/mock/finance/compound-rate-keeper/CompoundRateKeeperMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {OwnableCompoundRateKeeper} from "../../../finance/compound-rate-keeper/presets/OwnableCompoundRateKeeper.sol"; diff --git a/contracts/mock/finance/staking/AbstractStakingMock.sol b/contracts/mock/finance/staking/AbstractStakingMock.sol index 0b1a3878..8dc7daea 100644 --- a/contracts/mock/finance/staking/AbstractStakingMock.sol +++ b/contracts/mock/finance/staking/AbstractStakingMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {Multicall} from "@openzeppelin/contracts/utils/Multicall.sol"; diff --git a/contracts/mock/finance/staking/AbstractValueDistributorMock.sol b/contracts/mock/finance/staking/AbstractValueDistributorMock.sol index 58532dae..7a003316 100644 --- a/contracts/mock/finance/staking/AbstractValueDistributorMock.sol +++ b/contracts/mock/finance/staking/AbstractValueDistributorMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {Multicall} from "@openzeppelin/contracts/utils/Multicall.sol"; diff --git a/contracts/mock/finance/vesting/VestingMock.sol b/contracts/mock/finance/vesting/VestingMock.sol index ccadc7db..512f4467 100644 --- a/contracts/mock/finance/vesting/VestingMock.sol +++ b/contracts/mock/finance/vesting/VestingMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {Vesting} from "../../../finance/vesting/Vesting.sol"; diff --git a/contracts/mock/libs/arrays/ArrayHelperMock.sol b/contracts/mock/libs/arrays/ArrayHelperMock.sol index 60843240..8bc16790 100644 --- a/contracts/mock/libs/arrays/ArrayHelperMock.sol +++ b/contracts/mock/libs/arrays/ArrayHelperMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {ArrayHelper} from "../../../libs/arrays/ArrayHelper.sol"; diff --git a/contracts/mock/libs/arrays/PaginatorMock.sol b/contracts/mock/libs/arrays/PaginatorMock.sol index 3d636555..6f841c14 100644 --- a/contracts/mock/libs/arrays/PaginatorMock.sol +++ b/contracts/mock/libs/arrays/PaginatorMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; diff --git a/contracts/mock/libs/arrays/SetHelperMock.sol b/contracts/mock/libs/arrays/SetHelperMock.sol index 8a8cab7f..0b751958 100644 --- a/contracts/mock/libs/arrays/SetHelperMock.sol +++ b/contracts/mock/libs/arrays/SetHelperMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; diff --git a/contracts/mock/libs/data-structures/AvlTreeMock.sol b/contracts/mock/libs/data-structures/AvlTreeMock.sol index 66378e13..5ae36cff 100644 --- a/contracts/mock/libs/data-structures/AvlTreeMock.sol +++ b/contracts/mock/libs/data-structures/AvlTreeMock.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {TypeCaster} from "../../../libs/utils/TypeCaster.sol"; -import {Traversal, AvlTree} from "../../../libs/data-structures/AvlTree.sol"; +import {AvlTree, Traversal} from "../../../libs/data-structures/AvlTree.sol"; contract AvlTreeMock { using TypeCaster for *; diff --git a/contracts/mock/libs/data-structures/DynamicSetMock.sol b/contracts/mock/libs/data-structures/DynamicSetMock.sol index 7fc0d157..6c2beffd 100644 --- a/contracts/mock/libs/data-structures/DynamicSetMock.sol +++ b/contracts/mock/libs/data-structures/DynamicSetMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DynamicSet} from "../../../libs/data-structures/DynamicSet.sol"; diff --git a/contracts/mock/libs/data-structures/IncrementalMerkleTreeMock.sol b/contracts/mock/libs/data-structures/IncrementalMerkleTreeMock.sol index 226fb0a2..ee1d540d 100644 --- a/contracts/mock/libs/data-structures/IncrementalMerkleTreeMock.sol +++ b/contracts/mock/libs/data-structures/IncrementalMerkleTreeMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {IncrementalMerkleTree} from "../../../libs/data-structures/IncrementalMerkleTree.sol"; diff --git a/contracts/mock/libs/data-structures/PriorityQueueMock.sol b/contracts/mock/libs/data-structures/PriorityQueueMock.sol index dc52234d..41792592 100644 --- a/contracts/mock/libs/data-structures/PriorityQueueMock.sol +++ b/contracts/mock/libs/data-structures/PriorityQueueMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {PriorityQueue} from "../../../libs/data-structures/PriorityQueue.sol"; diff --git a/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol b/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol index 2e3ad90a..a71337eb 100644 --- a/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol +++ b/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {SparseMerkleTree} from "../../../libs/data-structures/SparseMerkleTree.sol"; diff --git a/contracts/mock/libs/data-structures/memory/VectorMock.sol b/contracts/mock/libs/data-structures/memory/VectorMock.sol index 41c772d6..08bb4c5c 100644 --- a/contracts/mock/libs/data-structures/memory/VectorMock.sol +++ b/contracts/mock/libs/data-structures/memory/VectorMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {Vector} from "../../../../libs/data-structures/memory/Vector.sol"; @@ -18,7 +19,7 @@ contract VectorMock { Vector.UintVector memory vector1_ = Vector.newUint(); - require(vector1_.length() == 0); + if (vector1_.length() != 0) revert(); assembly { mstore( @@ -37,76 +38,76 @@ contract VectorMock { Vector.UintVector memory vector2_ = Vector.newUint(3); - require(vector2_.length() == 3); + if (vector2_.length() != 3) revert(); for (uint256 i = 0; i < vector2_.length(); i++) { - require(vector2_.at(i) == 0); + if (vector2_.at(i) != 0) revert(); } } function testArrayPush() external pure { Vector.UintVector memory vector_ = Vector.newUint(); - require(vector_._vector._allocation == 5); - require(vector_.length() == 0); + if (vector_._vector._allocation != 5) revert(); + if (vector_.length() != 0) revert(); vector_.push([uint256(1), 2, 3].asDynamic()); - require(vector_.length() == 3); + if (vector_.length() != 3) revert(); } function testPushAndPop() external pure { Vector.UintVector memory vector_ = Vector.newUint(); - require(vector_._vector._allocation == 5); - require(vector_.length() == 0); + if (vector_._vector._allocation != 5) revert(); + if (vector_.length() != 0) revert(); vector_.push(1); vector_.push(2); vector_.push(3); - require(vector_.length() == 3); + if (vector_.length() != 3) revert(); for (uint256 i = 0; i < vector_.length(); i++) { - require(vector_.at(i) == i + 1); + if (vector_.at(i) != i + 1) revert(); } vector_.pop(); - require(vector_.length() == 2); + if (vector_.length() != 2) revert(); vector_.push(0); - require(vector_.at(2) == 0); + if (vector_.at(2) != 0) revert(); } function testResize() external pure { Vector.UintVector memory vector_ = Vector.newUint(0); - require(vector_._vector._allocation == 1); - require(vector_.length() == 0); + if (vector_._vector._allocation != 1) revert(); + if (vector_.length() != 0) revert(); for (uint256 i = 0; i < 10; i++) { vector_.push(i); } - require(vector_._vector._allocation == 16); - require(vector_.length() == 10); + if (vector_._vector._allocation != 16) revert(); + if (vector_.length() != 10) revert(); uint256[] memory array_ = vector_.toArray(); - require(array_.length == 10); + if (array_.length != 10) revert(); for (uint256 i = 0; i < array_.length; i++) { - require(array_[i] == i); + if (array_[i] != i) revert(); } } function testResizeAndSet() external pure { Vector.UintVector memory vector1_ = Vector.newUint(1); - require(vector1_.length() == 1); - require(vector1_.at(0) == 0); + if (vector1_.length() != 1) revert(); + if (vector1_.at(0) != 0) revert(); for (uint256 i = 1; i < 50; i++) { vector1_.push(i); @@ -114,18 +115,18 @@ contract VectorMock { uint256[] memory array_ = vector1_.toArray(); - require(array_.length == 50); + if (array_.length != 50) revert(); Vector.UintVector memory vector2_ = Vector.newUint(array_); - require(vector2_.length() == 50); + if (vector2_.length() != 50) revert(); for (uint256 i = 0; i < 50; i++) { - require(vector2_.at(i) == i); + if (vector2_.at(i) != i) revert(); vector2_.set(i, 50 - i); - require(vector2_.at(i) == 50 - i); + if (vector2_.at(i) != 50 - i) revert(); } } @@ -150,7 +151,7 @@ contract VectorMock { function testUintFunctionality() external pure { Vector.UintVector memory vector_ = Vector.newUint(); - require(vector_.length() == 0); + if (vector_.length() != 0) revert(); vector_.push(1); vector_.set(0, 2); @@ -159,41 +160,41 @@ contract VectorMock { uint256[] memory array_ = vector_.toArray(); - require(array_.length == 2); - require(array_[0] == 2); - require(array_[1] == 3); + if (array_.length != 2) revert(); + if (array_[0] != 2) revert(); + if (array_[1] != 3) revert(); array_[0] = 10; - require(vector_.at(0) == 10); + if (vector_.at(0) != 10) revert(); vector_ = Vector.newUint(5); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); vector_.push(0); vector_.pop(); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); array_[array_.length - 1] = 1; vector_ = Vector.newUint(array_); - require(vector_.length() == 5); - require(vector_.at(vector_.length() - 1) == 1); + if (vector_.length() != 5) revert(); + if (vector_.at(vector_.length() - 1) != 1) revert(); vector_.push([uint256(1), 2, 3].asDynamic()); - require(vector_.length() == 8); + if (vector_.length() != 8) revert(); } function testBytes32Functionality() external pure { Vector.Bytes32Vector memory vector_ = Vector.newBytes32(); - require(vector_.length() == 0); + if (vector_.length() != 0) revert(); vector_.push(bytes32(uint256(1))); vector_.set(0, bytes32(uint256(2))); @@ -202,41 +203,41 @@ contract VectorMock { bytes32[] memory array_ = vector_.toArray(); - require(array_.length == 2); - require(array_[0] == bytes32(uint256(2))); - require(array_[1] == bytes32(uint256(3))); + if (array_.length != 2) revert(); + if (array_[0] != bytes32(uint256(2))) revert(); + if (array_[1] != bytes32(uint256(3))) revert(); array_[0] = bytes32(uint256(10)); - require(vector_.at(0) == bytes32(uint256(10))); + if (vector_.at(0) != bytes32(uint256(10))) revert(); vector_ = Vector.newBytes32(5); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); vector_.push(0); vector_.pop(); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); array_[array_.length - 1] = bytes32(uint256(1)); vector_ = Vector.newBytes32(array_); - require(vector_.length() == 5); - require(vector_.at(vector_.length() - 1) == bytes32(uint256(1))); + if (vector_.length() != 5) revert(); + if (vector_.at(vector_.length() - 1) != bytes32(uint256(1))) revert(); vector_.push([bytes32(uint256(5)), bytes32(uint256(4)), bytes32(uint256(3))].asDynamic()); - require(vector_.length() == 8); + if (vector_.length() != 8) revert(); } function testAddressFunctionality() external pure { Vector.AddressVector memory vector_ = Vector.newAddress(); - require(vector_.length() == 0); + if (vector_.length() != 0) revert(); vector_.push(address(1)); vector_.set(0, address(2)); @@ -245,34 +246,34 @@ contract VectorMock { address[] memory array_ = vector_.toArray(); - require(array_.length == 2); - require(array_[0] == address(2)); - require(array_[1] == address(3)); + if (array_.length != 2) revert(); + if (array_[0] != address(2)) revert(); + if (array_[1] != address(3)) revert(); array_[0] = address(10); - require(vector_.at(0) == address(10)); + if (vector_.at(0) != address(10)) revert(); vector_ = Vector.newAddress(5); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); vector_.push(address(0)); vector_.pop(); array_ = vector_.toArray(); - require(array_.length == 5); + if (array_.length != 5) revert(); array_[array_.length - 1] = address(1); vector_ = Vector.newAddress(array_); - require(vector_.length() == 5); - require(vector_.at(vector_.length() - 1) == address(1)); + if (vector_.length() != 5) revert(); + if (vector_.at(vector_.length() - 1) != address(1)) revert(); vector_.push([address(5), address(4), address(3)].asDynamic()); - require(vector_.length() == 8); + if (vector_.length() != 8) revert(); } } diff --git a/contracts/mock/libs/utils/DecimalsConverterMock.sol b/contracts/mock/libs/utils/DecimalsConverterMock.sol index ca4eec24..ed4b4542 100644 --- a/contracts/mock/libs/utils/DecimalsConverterMock.sol +++ b/contracts/mock/libs/utils/DecimalsConverterMock.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {DecimalsConverter} from "../../../libs/utils/DecimalsConverter.sol"; -import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract DecimalsConverterMock { using DecimalsConverter for *; diff --git a/contracts/mock/libs/utils/MemoryUtilsMock.sol b/contracts/mock/libs/utils/MemoryUtilsMock.sol index 38e14f05..91bb5a97 100644 --- a/contracts/mock/libs/utils/MemoryUtilsMock.sol +++ b/contracts/mock/libs/utils/MemoryUtilsMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {MemoryUtils} from "../../../libs/utils/MemoryUtils.sol"; @@ -8,45 +9,37 @@ contract MemoryUtilsMock { using TypeCaster for *; using MemoryUtils for *; + error BytesMemoryCopyError(bool ifDataEqual); + error Bytes32MemoryCopyError(bool ifDataEqual); + error BigMemoryError(bool ifDataEqual); + error PartialCopyError(bool ifDataEqual); + function testBytesMemoryCopy(bytes memory data_) external view { bytes memory someBytes_ = new bytes(data_.length); - require( - keccak256(data_) != keccak256(someBytes_), - "MemoryUtilsMock: testBytesMemoryCopy failed. Initial data and someBytes are equal" - ); + if (keccak256(data_) == keccak256(someBytes_)) revert BytesMemoryCopyError(true); someBytes_ = data_.copy(); - require( - keccak256(data_) == keccak256(someBytes_), - "MemoryUtilsMock: testBytesMemoryCopy failed. Initial data and someBytes are not equal" - ); + if (keccak256(data_) != keccak256(someBytes_)) revert BytesMemoryCopyError(false); } function testBytes32MemoryCopy(bytes32[] memory data_) external view { bytes32[] memory someBytes_ = new bytes32[](data_.length); - require( - keccak256(abi.encode(data_)) != keccak256(abi.encode(someBytes_)), - "MemoryUtilsMock: testBytes32MemoryCopy failed. Initial data and someBytes are equal" - ); + if (keccak256(abi.encode(data_)) == keccak256(abi.encode(someBytes_))) + revert Bytes32MemoryCopyError(true); someBytes_ = data_.copy(); - require( - keccak256(abi.encode(data_)) == keccak256(abi.encode(someBytes_)), - "MemoryUtilsMock: testBytes32MemoryCopy failed. Initial data and someBytes are not equal" - ); + if (keccak256(abi.encode(data_)) != keccak256(abi.encode(someBytes_))) + revert Bytes32MemoryCopyError(false); } function testUnsafeMemoryCopy(bytes memory data_) external view { bytes memory someBytes_ = new bytes(data_.length); - require( - keccak256(data_) != keccak256(someBytes_), - "MemoryUtilsMock: testBigMemory failed. Initial data and someBytes are equal" - ); + if (keccak256(data_) == keccak256(someBytes_)) revert BigMemoryError(true); MemoryUtils.unsafeCopy( MemoryUtils.getDataPointer(someBytes_), @@ -54,19 +47,13 @@ contract MemoryUtilsMock { someBytes_.length ); - require( - keccak256(data_) == keccak256(someBytes_), - "MemoryUtilsMock: testBigMemory failed. Initial data and someBytes are not equal" - ); + if (keccak256(data_) != keccak256(someBytes_)) revert BigMemoryError(false); } function testPartialCopy(bytes memory data_) external view { bytes memory someBytes_ = new bytes(data_.length / 2); - require( - keccak256(data_) != keccak256(someBytes_), - "MemoryUtilsMock: testPartialCopy failed. Initial data and someBytes are equal" - ); + if (keccak256(data_) == keccak256(someBytes_)) revert PartialCopyError(true); MemoryUtils.unsafeCopy( MemoryUtils.getDataPointer(someBytes_), @@ -75,10 +62,7 @@ contract MemoryUtilsMock { ); for (uint256 i = 0; i < someBytes_.length; i++) { - require( - someBytes_[i] == data_[i], - "MemoryUtilsMock: testPartialCopy failed. Initial data and someBytes are not equal" - ); + if (someBytes_[i] != data_[i]) revert PartialCopyError(false); } } diff --git a/contracts/mock/libs/utils/ReturnDataProxyMock.sol b/contracts/mock/libs/utils/ReturnDataProxyMock.sol index ace3f53e..c54f6ae8 100644 --- a/contracts/mock/libs/utils/ReturnDataProxyMock.sol +++ b/contracts/mock/libs/utils/ReturnDataProxyMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {ReturnDataProxy} from "../../../libs/utils/ReturnDataProxy.sol"; @@ -12,6 +13,8 @@ struct Entry { contract RawReturnMock { uint256 private _mirror; + error Test(); + receive() external payable {} function setMirror(uint256 mirror_) external { @@ -27,7 +30,7 @@ contract RawReturnMock { } function revertWithMessage() external pure { - revert("test"); + revert Test(); } function getEntry() external pure returns (Entry memory) { diff --git a/contracts/mock/libs/utils/TypeCasterMock.sol b/contracts/mock/libs/utils/TypeCasterMock.sol index 25ac1e2f..dacb0d06 100644 --- a/contracts/mock/libs/utils/TypeCasterMock.sol +++ b/contracts/mock/libs/utils/TypeCasterMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {TypeCaster} from "../../../libs/utils/TypeCaster.sol"; diff --git a/contracts/mock/libs/zkp/snarkjs/VerifierHelperMock.sol b/contracts/mock/libs/zkp/snarkjs/VerifierHelperMock.sol index b23f7cba..1aca6abf 100644 --- a/contracts/mock/libs/zkp/snarkjs/VerifierHelperMock.sol +++ b/contracts/mock/libs/zkp/snarkjs/VerifierHelperMock.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; -import {VerifierHelper} from "../../../../libs/zkp/snarkjs/VerifierHelper.sol"; +import {VerifierHelper} from "../../../../libs/zkp/VerifierHelper.sol"; contract VerifierHelperMock { using VerifierHelper for address; diff --git a/contracts/mock/libs/zkp/snarkjs/VerifierMock.sol b/contracts/mock/libs/zkp/snarkjs/VerifierMock.sol index 1e90f734..3ca9a331 100644 --- a/contracts/mock/libs/zkp/snarkjs/VerifierMock.sol +++ b/contracts/mock/libs/zkp/snarkjs/VerifierMock.sol @@ -1,10 +1,13 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; contract BaseVerifierMock { bool public verifyResult; uint256[] public expectedInputs; + error InvalidInputs(); + constructor(bool verifyResult_, uint256[] memory expectedInputs_) { verifyResult = verifyResult_; expectedInputs = expectedInputs_; @@ -32,7 +35,7 @@ contract Verifier2Mock is BaseVerifierMock { uint256[2] memory inputs_ ) external view returns (bool) { for (uint256 i = 0; i < inputs_.length; i++) { - require(inputs_[i] == expectedInputs[i], "Verifier2Mock: invalid inputs"); + if (inputs_[i] != expectedInputs[i]) revert InvalidInputs(); } return verifyResult; @@ -52,7 +55,7 @@ contract Verifier3Mock is BaseVerifierMock { uint256[3] memory inputs_ ) external view returns (bool) { for (uint256 i = 0; i < inputs_.length; i++) { - require(inputs_[i] == expectedInputs[i], "Verifier3Mock: invalid inputs"); + if (inputs_[i] != expectedInputs[i]) revert InvalidInputs(); } return verifyResult; diff --git a/contracts/mock/oracles/uniswap-v2/UniswapV2FactoryMock.sol b/contracts/mock/oracles/uniswap-v2/UniswapV2FactoryMock.sol index 68be6692..a57453af 100644 --- a/contracts/mock/oracles/uniswap-v2/UniswapV2FactoryMock.sol +++ b/contracts/mock/oracles/uniswap-v2/UniswapV2FactoryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {IUniswapV2Pair} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; diff --git a/contracts/mock/oracles/uniswap-v2/UniswapV2OracleMock.sol b/contracts/mock/oracles/uniswap-v2/UniswapV2OracleMock.sol index c32cd474..8b91664f 100644 --- a/contracts/mock/oracles/uniswap-v2/UniswapV2OracleMock.sol +++ b/contracts/mock/oracles/uniswap-v2/UniswapV2OracleMock.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {UniswapV2Oracle} from "../../../oracles/UniswapV2Oracle.sol"; -import {UniswapV2PairMock} from "./UniswapV2PairMock.sol"; contract UniswapV2OracleMock is UniswapV2Oracle { using EnumerableSet for EnumerableSet.AddressSet; diff --git a/contracts/mock/oracles/uniswap-v2/UniswapV2PairMock.sol b/contracts/mock/oracles/uniswap-v2/UniswapV2PairMock.sol index e21cb2bf..edee48dc 100644 --- a/contracts/mock/oracles/uniswap-v2/UniswapV2PairMock.sol +++ b/contracts/mock/oracles/uniswap-v2/UniswapV2PairMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; contract UniswapV2PairMock { diff --git a/contracts/mock/oracles/uniswap-v3/UniswapV3FactoryMock.sol b/contracts/mock/oracles/uniswap-v3/UniswapV3FactoryMock.sol index e5b927cb..311be0c8 100644 --- a/contracts/mock/oracles/uniswap-v3/UniswapV3FactoryMock.sol +++ b/contracts/mock/oracles/uniswap-v3/UniswapV3FactoryMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity >=0.5.0 <0.8.0; import {UniswapV3PoolMock} from "./UniswapV3PoolMock.sol"; diff --git a/contracts/mock/oracles/uniswap-v3/UniswapV3PoolMock.sol b/contracts/mock/oracles/uniswap-v3/UniswapV3PoolMock.sol index b89fe39c..0825b68c 100644 --- a/contracts/mock/oracles/uniswap-v3/UniswapV3PoolMock.sol +++ b/contracts/mock/oracles/uniswap-v3/UniswapV3PoolMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity >=0.5.0 <0.8.0; import {Oracle} from "@uniswap/v3-core/contracts/libraries/Oracle.sol"; diff --git a/contracts/mock/tokens/ERC20Mock.sol b/contracts/mock/tokens/ERC20Mock.sol index 544df5ca..c2a839b1 100644 --- a/contracts/mock/tokens/ERC20Mock.sol +++ b/contracts/mock/tokens/ERC20Mock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/contracts/mock/tokens/SBTMock.sol b/contracts/mock/tokens/SBTMock.sol index 5f2b882f..96563dc8 100644 --- a/contracts/mock/tokens/SBTMock.sol +++ b/contracts/mock/tokens/SBTMock.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; import {SBT} from "./../../tokens/SBT.sol"; diff --git a/contracts/mock/utils/BlockGuardMock.sol b/contracts/mock/utils/BlockGuardMock.sol index ac5bf653..3ecd93d8 100644 --- a/contracts/mock/utils/BlockGuardMock.sol +++ b/contracts/mock/utils/BlockGuardMock.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity ^0.8.4; -import "@openzeppelin/contracts/utils/Multicall.sol"; +import {Multicall} from "@openzeppelin/contracts/utils/Multicall.sol"; -import "../../utils/BlockGuard.sol"; +import {BlockGuard} from "../../utils/BlockGuard.sol"; contract BlockGuardMock is Multicall, BlockGuard { string public constant DEPOSIT_WITHDRAW_RESOURCE = "DEPOSIT_WITHDRAW"; diff --git a/contracts/oracles/UniswapV2Oracle.sol b/contracts/oracles/UniswapV2Oracle.sol index 520eace8..4134811b 100644 --- a/contracts/oracles/UniswapV2Oracle.sol +++ b/contracts/oracles/UniswapV2Oracle.sol @@ -40,6 +40,11 @@ abstract contract UniswapV2Oracle is Initializable { mapping(address => address[]) private _paths; mapping(address => PairInfo) private _pairInfos; + error InvalidPath(address tokenIn, uint256 pathLength); + error PathAlreadyRegistered(address tokenIn); + error PairDoesNotExist(address token1, address token2); + error TimeWindowIsZero(); + /** * @notice Constructor * @param uniswapV2Factory_ the Uniswap V2 factory @@ -96,7 +101,7 @@ abstract contract UniswapV2Oracle is Initializable { address[] storage path = _paths[tokenIn_]; uint256 pathLength_ = path.length; - require(pathLength_ > 1, "UniswapV2Oracle: invalid path"); + if (pathLength_ < 2) revert InvalidPath(tokenIn_, pathLength_); address tokenOut_ = path[pathLength_ - 1]; @@ -163,7 +168,7 @@ abstract contract UniswapV2Oracle is Initializable { * @param newTimeWindow_ the new time window value in seconds */ function _setTimeWindow(uint256 newTimeWindow_) internal { - require(newTimeWindow_ > 0, "UniswapV2Oracle: time window can't be 0"); + if (newTimeWindow_ == 0) revert TimeWindowIsZero(); timeWindow = newTimeWindow_; } @@ -177,16 +182,15 @@ abstract contract UniswapV2Oracle is Initializable { for (uint256 i = 0; i < numberOfPaths_; i++) { uint256 pathLength_ = paths_[i].length; - - require(pathLength_ >= 2, "UniswapV2Oracle: path must be longer than 2"); - address tokenIn_ = paths_[i][0]; - require(_paths[tokenIn_].length == 0, "UniswapV2Oracle: path already registered"); + if (pathLength_ < 2) revert InvalidPath(tokenIn_, pathLength_); + if (_paths[tokenIn_].length != 0) revert PathAlreadyRegistered(tokenIn_); for (uint256 j = 0; j < pathLength_ - 1; j++) { (bool exists_, address pair_) = _pairExists(paths_[i][j], paths_[i][j + 1]); - require(exists_, "UniswapV2Oracle: uniswap pair doesn't exist"); + + if (!exists_) revert PairDoesNotExist(paths_[i][j], paths_[i][j + 1]); _pairs.add(pair_); _pairInfos[pair_].refs++; diff --git a/contracts/oracles/UniswapV3Oracle.sol b/contracts/oracles/UniswapV3Oracle.sol index dc70d7b4..4e6cc7ec 100644 --- a/contracts/oracles/UniswapV3Oracle.sol +++ b/contracts/oracles/UniswapV3Oracle.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT +// solhint-disable pragma solidity >=0.5.0 <0.8.0; import {IUniswapV3Factory} from "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; -import {IUniswapV3Pool} from "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; import {FullMath} from "@uniswap/v3-core/contracts/libraries/FullMath.sol"; import {OracleLibrary} from "@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol"; diff --git a/contracts/proxy/adminable/AdminableProxy.sol b/contracts/proxy/adminable/AdminableProxy.sol new file mode 100644 index 00000000..a96354fd --- /dev/null +++ b/contracts/proxy/adminable/AdminableProxy.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.2/contracts/proxy/transparent/TransparentUpgradeableProxy.sol + +pragma solidity ^0.8.4; + +import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {IAdminableProxy} from "../../interfaces/proxy/IAdminableProxy.sol"; + +/** + * @notice This contract implements a proxy that is upgradeable by an admin. + * + * The implementation of this contract is based on OpenZeppelin's TransparentUpgradeableProxy. + * The main change is in the constructor. While the original contract deploys an instance of ProxyAdmin + * for every proxy, this implementation simply sets the specified address as the admin. + * Additionally, an implementation function has been added. + * + * For more information about proxy logic, please refer to the OpenZeppelin documentation. + */ +contract AdminableProxy is ERC1967Proxy { + // solhint-disable-previous-line immutable-vars-naming + address private immutable _ADMIN; + + error ProxyDeniedAdminAccess(); + + constructor( + address logic_, + address admin_, + bytes memory data_ + ) payable ERC1967Proxy(logic_, data_) { + _ADMIN = admin_; + ERC1967Utils.changeAdmin(admin_); + } + + function _fallback() internal virtual override { + if (msg.sender == _ADMIN) { + bytes4 selector_ = msg.sig; + + if (selector_ == IAdminableProxy.upgradeToAndCall.selector) { + _dispatchUpgradeToAndCall(); + } else if (selector_ == IAdminableProxy.implementation.selector) { + bytes memory returndata_ = _dispatchImplementation(); + + assembly { + return(add(returndata_, 0x20), mload(returndata_)) + } + } else { + revert ProxyDeniedAdminAccess(); + } + } else { + super._fallback(); + } + } + + function _dispatchUpgradeToAndCall() private { + (address newImplementation_, bytes memory data_) = abi.decode( + msg.data[4:], + (address, bytes) + ); + ERC1967Utils.upgradeToAndCall(newImplementation_, data_); + } + + function _dispatchImplementation() private view returns (bytes memory) { + return abi.encode(_implementation()); + } +} diff --git a/contracts/proxy/transparent/TransparentProxyUpgrader.sol b/contracts/proxy/adminable/AdminableProxyUpgrader.sol similarity index 53% rename from contracts/proxy/transparent/TransparentProxyUpgrader.sol rename to contracts/proxy/adminable/AdminableProxyUpgrader.sol index b3c09535..86dc044a 100644 --- a/contracts/proxy/transparent/TransparentProxyUpgrader.sol +++ b/contracts/proxy/adminable/AdminableProxyUpgrader.sol @@ -1,46 +1,35 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; -import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; - import {PermanentOwnable} from "../../access/PermanentOwnable.sol"; +import {IAdminableProxy} from "./AdminableProxy.sol"; /** * @notice The proxies module * - * This is the lightweight helper contract that may be used as a TransparentProxy admin. + * This is the lightweight helper contract that may be used as a AdminableProxy admin. */ -contract TransparentProxyUpgrader is PermanentOwnable { - using Address for address; - +contract AdminableProxyUpgrader is PermanentOwnable { constructor() PermanentOwnable(msg.sender) {} /** * @notice The function to upgrade the implementation contract + * @dev an attempt to upgrade a non-proxy contract will result in revert * @param what_ the proxy contract to upgrade * @param to_ the new implementation contract * @param data_ arbitrary data the proxy will be called with after the upgrade */ function upgrade(address what_, address to_, bytes calldata data_) external virtual onlyOwner { - if (data_.length > 0) { - ITransparentUpgradeableProxy(payable(what_)).upgradeToAndCall(to_, data_); - } else { - ITransparentUpgradeableProxy(payable(what_)).upgradeTo(to_); - } + IAdminableProxy(payable(what_)).upgradeToAndCall(to_, data_); } /** * @notice The function to get the address of the proxy implementation + * @dev an attempt to get implementation from a non-proxy contract will result in revert * @param what_ the proxy contract to observe * @return the implementation address */ function getImplementation(address what_) public view virtual returns (address) { - // bytes4(keccak256("implementation()")) == 0x5c60da1b - (bool success_, bytes memory returndata_) = address(what_).staticcall(hex"5c60da1b"); - - require(success_, "TransparentProxyUpgrader: not a proxy"); - - return abi.decode(returndata_, (address)); + return IAdminableProxy(what_).implementation(); } } diff --git a/contracts/proxy/beacon/ProxyBeacon.sol b/contracts/proxy/beacon/ProxyBeacon.sol index 1f67cdb8..aa0f29e9 100644 --- a/contracts/proxy/beacon/ProxyBeacon.sol +++ b/contracts/proxy/beacon/ProxyBeacon.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.4; import {IBeacon} from "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; -import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {PermanentOwnable} from "../../access/PermanentOwnable.sol"; @@ -12,20 +11,21 @@ import {PermanentOwnable} from "../../access/PermanentOwnable.sol"; * This is a lightweight utility ProxyBeacon contract that may be used as a beacon that BeaconProxies point to. */ contract ProxyBeacon is IBeacon, PermanentOwnable { - using Address for address; - constructor() PermanentOwnable(msg.sender) {} address private _implementation; event Upgraded(address implementation); + error NewImplementationNotAContract(address newImplementation); + /** * @notice The function to upgrade to implementation contract * @param newImplementation_ the new implementation */ function upgradeTo(address newImplementation_) external virtual onlyOwner { - require(newImplementation_.isContract(), "ProxyBeacon: not a contract"); + if (newImplementation_.code.length == 0) + revert NewImplementationNotAContract(newImplementation_); _implementation = newImplementation_; diff --git a/contracts/tokens/SBT.sol b/contracts/tokens/SBT.sol index bde38d9f..fd9a0ab6 100644 --- a/contracts/tokens/SBT.sol +++ b/contracts/tokens/SBT.sol @@ -29,6 +29,10 @@ abstract contract SBT is ISBT, ERC165Upgradeable { string private _baseURI; mapping(uint256 => string) private _tokenURIs; + error ReceiverIsZeroAddress(); + error TokenAlreadyExists(uint256 tokenId); + error TokenDoesNotExist(uint256 tokenId); + /** * @notice The constructor * @param name_ the name of the contract (can't be changed) @@ -156,8 +160,8 @@ abstract contract SBT is ISBT, ERC165Upgradeable { * @param tokenId_ the token to mint */ function _mint(address to_, uint256 tokenId_) internal virtual { - require(to_ != address(0), "SBT: address(0) receiver"); - require(!tokenExists(tokenId_), "SBT: token already exists"); + if (to_ == address(0)) revert ReceiverIsZeroAddress(); + if (tokenExists(tokenId_)) revert TokenAlreadyExists(tokenId_); _beforeTokenAction(to_, tokenId_); @@ -173,7 +177,8 @@ abstract contract SBT is ISBT, ERC165Upgradeable { */ function _burn(uint256 tokenId_) internal virtual { address owner_ = _ownerOf(tokenId_); - require(owner_ != address(0), "SBT: token doesn't exist"); + + if (owner_ == address(0)) revert TokenDoesNotExist(tokenId_); _beforeTokenAction(address(0), tokenId_); @@ -191,7 +196,7 @@ abstract contract SBT is ISBT, ERC165Upgradeable { * @param tokenURI_ the URI to be set */ function _setTokenURI(uint256 tokenId_, string memory tokenURI_) internal virtual { - require(tokenExists(tokenId_), "SBT: token doesn't exist"); + if (!tokenExists(tokenId_)) revert TokenDoesNotExist(tokenId_); _tokenURIs[tokenId_] = tokenURI_; } diff --git a/contracts/utils/BlockGuard.sol b/contracts/utils/BlockGuard.sol index 4d59ef7f..75cae751 100644 --- a/contracts/utils/BlockGuard.sol +++ b/contracts/utils/BlockGuard.sol @@ -24,6 +24,8 @@ pragma solidity ^0.8.4; abstract contract BlockGuard { mapping(string => mapping(address => uint256)) private _lockedInBlocks; + error BlockGuardLocked(string resource, address key); + modifier lockBlock(string memory resource_, address key_) { _lockBlock(resource_, key_); _; @@ -55,7 +57,8 @@ abstract contract BlockGuard { * @param key_ the key of the resource (the caller) */ function _checkBlock(string memory resource_, address key_) internal view { - require(_lockedInBlocks[resource_][key_] != _getBlockNumber(), "BlockGuard: locked"); + if (_lockedInBlocks[resource_][key_] == _getBlockNumber()) + revert BlockGuardLocked(resource_, key_); } /** diff --git a/hardhat.config.ts b/hardhat.config.ts index cc70cc4a..46b4d608 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -26,7 +26,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: "0.8.20", + version: "0.8.25", settings: { optimizer: { enabled: true, diff --git a/package-lock.json b/package-lock.json index 80b28e76..1f148f0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@solarity/solidity-lib", - "version": "2.7.11", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@solarity/solidity-lib", - "version": "2.7.11", + "version": "3.0.0", "license": "MIT", "dependencies": { - "@openzeppelin/contracts": "4.9.6", - "@openzeppelin/contracts-upgradeable": "4.9.6", + "@openzeppelin/contracts": "5.1.0", + "@openzeppelin/contracts-upgradeable": "5.1.0", "@uniswap/v2-core": "1.0.1", "@uniswap/v2-periphery": "1.1.0-beta.0", "@uniswap/v3-core": "1.0.1", @@ -18,53 +18,49 @@ }, "devDependencies": { "@iden3/js-crypto": "^1.1.0", - "@iden3/js-merkletree": "^1.2.0", - "@metamask/eth-sig-util": "^7.0.3", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.7", - "@nomicfoundation/hardhat-ethers": "^3.0.6", - "@nomicfoundation/hardhat-network-helpers": "^1.0.10", + "@iden3/js-merkletree": "^1.3.1", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-network-helpers": "^1.0.12", "@solarity/hardhat-markup": "^1.0.8", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.7", + "@types/mocha": "^10.0.9", "@types/node": "^18.16.0", - "bignumber.js": "^9.1.2", "chai": "^4.4.1", "circomlibjs": "^0.1.7", "dotenv": "^16.4.5", - "ethers": "^6.13.1", - "hardhat": "^2.22.0", + "ethers": "^6.13.4", + "hardhat": "^2.22.15", "hardhat-contract-sizer": "^2.10.0", - "hardhat-gas-reporter": "^2.2.0", - "husky": "^9.0.11", + "hardhat-gas-reporter": "^2.2.1", + "husky": "^9.1.6", "merkletreejs": "^0.4.0", - "mocha": "^10.6.0", "mock-local-storage": "^1.1.24", "prettier": "^3.3.3", - "prettier-plugin-solidity": "^1.3.1", - "solhint": "^5.0.1", + "prettier-plugin-solidity": "^1.4.1", + "solhint": "^5.0.3", "solhint-plugin-prettier": "^0.1.0", - "solidity-coverage": "^0.8.12", + "solidity-coverage": "^0.8.13", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typechain": "^8.3.2", - "typescript": "^5.5.3" + "typescript": "^5.6.3" } }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -72,34 +68,17 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.9", "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@colors/colors": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -107,9 +86,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -117,21 +95,10 @@ "node": ">=12" } }, - "node_modules/@ethereumjs/common": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", - "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", - "dev": true, - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "crc-32": "^1.2.0" - } - }, "node_modules/@ethereumjs/rlp": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", "dev": true, + "license": "MPL-2.0", "bin": { "rlp": "bin/rlp" }, @@ -139,39 +106,79 @@ "node": ">=14" } }, - "node_modules/@ethereumjs/tx": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", - "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", + "node_modules/@ethereumjs/util": { + "version": "8.1.0", "dev": true, + "license": "MPL-2.0", "dependencies": { - "@ethereumjs/common": "^3.2.0", "@ethereumjs/rlp": "^4.0.1", - "@ethereumjs/util": "^8.1.0", - "ethereum-cryptography": "^2.0.0" + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" }, "engines": { "node": ">=14" } }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.4.2", "dev": true, + "license": "MIT", "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@noble/hashes": "1.4.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, "node_modules/@ethersproject/abi": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "dev": true, "funding": [ { @@ -183,6 +190,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -197,8 +205,6 @@ }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "dev": true, "funding": [ { @@ -210,6 +216,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -222,8 +229,6 @@ }, "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "dev": true, "funding": [ { @@ -235,6 +240,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -245,8 +251,6 @@ }, "node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "dev": true, "funding": [ { @@ -258,6 +262,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -268,8 +273,6 @@ }, "node_modules/@ethersproject/base64": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "dev": true, "funding": [ { @@ -281,14 +284,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "dev": true, "funding": [ { @@ -300,6 +302,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -307,8 +310,6 @@ }, "node_modules/@ethersproject/bignumber": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "dev": true, "funding": [ { @@ -320,6 +321,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -328,8 +330,6 @@ }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "dev": true, "funding": [ { @@ -341,14 +341,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "dev": true, "funding": [ { @@ -360,14 +359,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "dev": true, "funding": [ { @@ -379,6 +377,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -394,8 +393,6 @@ }, "node_modules/@ethersproject/hash": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "dev": true, "funding": [ { @@ -407,6 +404,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -421,8 +419,6 @@ }, "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "dev": true, "funding": [ { @@ -434,6 +430,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -451,8 +448,6 @@ }, "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "dev": true, "funding": [ { @@ -464,6 +459,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -482,14 +478,11 @@ }, "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "dev": true, "funding": [ { @@ -501,6 +494,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -508,8 +502,6 @@ }, "node_modules/@ethersproject/logger": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "dev": true, "funding": [ { @@ -520,12 +512,11 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, "funding": [ { @@ -537,14 +528,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "dev": true, "funding": [ { @@ -556,6 +546,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -563,8 +554,6 @@ }, "node_modules/@ethersproject/properties": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "dev": true, "funding": [ { @@ -576,14 +565,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "dev": true, "funding": [ { @@ -595,6 +583,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -620,9 +609,8 @@ }, "node_modules/@ethersproject/providers/node_modules/ws": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -641,8 +629,6 @@ }, "node_modules/@ethersproject/random": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "dev": true, "funding": [ { @@ -654,6 +640,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -661,8 +648,6 @@ }, "node_modules/@ethersproject/rlp": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "dev": true, "funding": [ { @@ -674,6 +659,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -681,8 +667,6 @@ }, "node_modules/@ethersproject/sha2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "dev": true, "funding": [ { @@ -694,6 +678,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -702,8 +687,6 @@ }, "node_modules/@ethersproject/signing-key": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "dev": true, "funding": [ { @@ -715,6 +698,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -726,8 +710,6 @@ }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "dev": true, "funding": [ { @@ -739,6 +721,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -750,8 +733,6 @@ }, "node_modules/@ethersproject/strings": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "dev": true, "funding": [ { @@ -763,6 +744,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -771,8 +753,6 @@ }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "dev": true, "funding": [ { @@ -784,6 +764,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -798,8 +779,6 @@ }, "node_modules/@ethersproject/units": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "dev": true, "funding": [ { @@ -811,6 +790,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -819,8 +799,6 @@ }, "node_modules/@ethersproject/wallet": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "dev": true, "funding": [ { @@ -832,6 +810,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -852,8 +831,6 @@ }, "node_modules/@ethersproject/web": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, "funding": [ { @@ -865,6 +842,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -875,8 +853,6 @@ }, "node_modules/@ethersproject/wordlists": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "dev": true, "funding": [ { @@ -888,6 +864,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -898,24 +875,21 @@ }, "node_modules/@fastify/busboy": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@iden3/js-crypto": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@iden3/js-crypto/-/js-crypto-1.1.0.tgz", - "integrity": "sha512-MbL7OpOxBoCybAPoorxrp+fwjDVESyDe6giIWxErjEIJy0Q2n1DU4VmKh4vDoCyhJx/RdVgT8Dkb59lKwISqsw==", - "dev": true + "dev": true, + "license": "AGPL-3.0" }, "node_modules/@iden3/js-merkletree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@iden3/js-merkletree/-/js-merkletree-1.2.0.tgz", - "integrity": "sha512-tM6jj1v/41qQ6V2K6CTrv0KsNHQ2y/O6Q9RSB1SdN2LTu+cgA9FnD2Qr3whzSvwgUs7X3SjuJgb9OTgs0lDemQ==", + "version": "1.3.1", "dev": true, + "license": "MIT or Apache-2.0", "peerDependencies": { "@iden3/js-crypto": "1.1.0", "idb-keyval": "^6.2.0" @@ -923,9 +897,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -939,10 +912,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -952,9 +924,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -964,15 +935,13 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -987,9 +956,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1002,9 +970,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -1019,105 +986,83 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@metamask/abi-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-2.0.4.tgz", - "integrity": "sha512-StnIgUB75x7a7AgUhiaUZDpCsqGp7VkNnZh2XivXkJ6mPkE83U8ARGQj5MbRis7VJY8BC5V1AbB1fjdh0hupPQ==", + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@metamask/superstruct": "^3.1.0", - "@metamask/utils": "^9.0.0" + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=12.0.0" } }, - "node_modules/@metamask/eth-sig-util": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-7.0.3.tgz", - "integrity": "sha512-PAtGnOkYvh90k2lEZldq/FK7GTLF6WxE+2bV85PoA3pqlJnmJCAY62tuvxHSwnVngSKlc4mcNvjnUg2eYO6JGg==", + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@ethereumjs/util": "^8.1.0", - "@metamask/abi-utils": "^2.0.4", - "@metamask/utils": "^9.0.0", - "@scure/base": "~1.1.3", - "ethereum-cryptography": "^2.1.2", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" + "@types/node": "*" } }, - "node_modules/@metamask/superstruct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz", - "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==", + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.1", "dev": true, - "engines": { - "node": ">=16.0.0" - } + "license": "MIT" }, - "node_modules/@metamask/utils": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.1.0.tgz", - "integrity": "sha512-g2REf+xSt0OZfMoNNdC4+/Yy8eP3KUqvIArel54XRFKPoXbHI6+YjFfrLtfykWBjffOp7DTfIc3Kvk5TLfuiyg==", + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", "dev": true, + "license": "MPL-2.0", "dependencies": { - "@ethereumjs/tx": "^4.2.0", - "@metamask/superstruct": "^3.1.0", - "@noble/hashes": "^1.3.1", - "@scure/base": "^1.1.3", - "@types/debug": "^4.1.7", - "debug": "^4.3.4", - "pony-cause": "^2.1.10", - "semver": "^7.5.4", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, "node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.3.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.3.2", "dev": true, + "license": "MIT", "engines": { "node": ">= 16" }, @@ -1127,21 +1072,19 @@ }, "node_modules/@noble/secp256k1": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1152,18 +1095,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1173,100 +1114,90 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.4.2.tgz", - "integrity": "sha512-U7v0HuZHfrsl/5FpUzuB2FYA0+FUglHHwiO6NhvLtNYKMZcPzdS6iUriMp/7GWs0SVxW3bAht9GinZPxdhVwWg==", + "version": "0.6.4", "dev": true, + "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.4.2", - "@nomicfoundation/edr-darwin-x64": "0.4.2", - "@nomicfoundation/edr-linux-arm64-gnu": "0.4.2", - "@nomicfoundation/edr-linux-arm64-musl": "0.4.2", - "@nomicfoundation/edr-linux-x64-gnu": "0.4.2", - "@nomicfoundation/edr-linux-x64-musl": "0.4.2", - "@nomicfoundation/edr-win32-x64-msvc": "0.4.2" + "@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" }, "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.2.tgz", - "integrity": "sha512-S+hhepupfqpBvMa9M1PVS08sVjGXsLnjyAsjhrrsjsNuTHVLhKzhkguvBD5g4If5skrwgOaVqpag4wnQbd15kQ==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.2.tgz", - "integrity": "sha512-/zM94AUrXz6CmcsecRNHJ50jABDUFafmGc4iBmkfX/mTp4tVZj7XTyIogrQIt0FnTaeb4CgZoLap2+8tW/Uldg==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.2.tgz", - "integrity": "sha512-TV3Pr2tFvvmCfPCi9PaCGLtqn+oLaPKfL2NWpnoCeFFdzDQXi2L930yP1oUPY5RXd78NLdVHMkEkbhb2b6Wuvg==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.2.tgz", - "integrity": "sha512-PALwrLBk1M9rolXyhSX8xdhe5jL0qf/PgiCIF7W7lUyVKrI/I0oiU0EHDk/Xw7yi2UJg4WRyhhZoHYa0g4g8Qg==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.2.tgz", - "integrity": "sha512-5svkftypDjAZ1LxV1onojlaqPRxrTEjJLkrUwLL+Fao5ZMe7aTnk5QQ1Jv76gW6WYZnMXNgjPhRcnw3oSNrqFA==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.2.tgz", - "integrity": "sha512-qiMlXQTggdH9zfOB4Eil4rQ95z8s7QdLJcOfz5Aym12qJNkCyF9hi4cc4dDCWA0CdI3x3oLbuf8qb81SF8R45w==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.2.tgz", - "integrity": "sha512-hDkAb0iaMmGYwBY/rA1oCX8VpsezfQcHPEPIEGXEcWC3WbnOgIZo0Qkpu/g0OMtFOJSQlWLXvKZuV7blhnrQag==", + "version": "0.6.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/ethereumjs-common": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", - "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dev": true, + "license": "MIT", "dependencies": { "@nomicfoundation/ethereumjs-util": "9.0.4" } }, "node_modules/@nomicfoundation/ethereumjs-rlp": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", - "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", "dev": true, + "license": "MPL-2.0", "bin": { "rlp": "bin/rlp.cjs" }, @@ -1276,9 +1207,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-tx": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", - "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-rlp": "5.0.4", @@ -1297,34 +1227,10 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-util": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", - "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" @@ -1341,34 +1247,10 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.7.tgz", - "integrity": "sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==", + "version": "2.0.8", "dev": true, + "license": "MIT", "dependencies": { "@types/chai-as-promised": "^7.1.3", "chai-as-promised": "^7.1.1", @@ -1383,10 +1265,9 @@ } }, "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.6.tgz", - "integrity": "sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==", + "version": "3.0.8", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "lodash.isequal": "^4.5.0" @@ -1397,10 +1278,9 @@ } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz", - "integrity": "sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==", + "version": "1.0.12", "dev": true, + "license": "MIT", "dependencies": { "ethereumjs-util": "^7.1.4" }, @@ -1410,9 +1290,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", - "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" }, @@ -1428,9 +1307,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", - "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1438,9 +1316,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", - "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1448,9 +1325,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", - "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1458,9 +1334,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", - "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1468,9 +1343,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", - "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1478,9 +1352,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", - "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" @@ -1488,29 +1361,28 @@ }, "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", - "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 12" } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" + "version": "5.1.0", + "license": "MIT" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", - "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==" + "version": "5.1.0", + "license": "MIT", + "peerDependencies": { + "@openzeppelin/contracts": "5.1.0" + } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -1518,18 +1390,16 @@ }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.22.0" } }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -1539,15 +1409,13 @@ }, "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "version": "2.3.1", "dev": true, + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -1559,9 +1427,8 @@ }, "node_modules/@prettier/sync": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@prettier/sync/-/sync-0.3.0.tgz", - "integrity": "sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/prettier/prettier-synchronized?sponsor=1" }, @@ -1570,36 +1437,33 @@ } }, "node_modules/@scure/base": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", - "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "version": "1.1.9", "dev": true, + "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "version": "1.3.2", "dev": true, + "license": "MIT", "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1607,9 +1471,8 @@ }, "node_modules/@sentry/core": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1623,15 +1486,13 @@ }, "node_modules/@sentry/core/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sentry/hub": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -1643,15 +1504,13 @@ }, "node_modules/@sentry/hub/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sentry/minimal": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -1663,15 +1522,13 @@ }, "node_modules/@sentry/minimal/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sentry/node": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -1689,15 +1546,13 @@ }, "node_modules/@sentry/node/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sentry/tracing": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, + "license": "MIT", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1711,24 +1566,21 @@ }, "node_modules/@sentry/tracing/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sentry/types": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=6" } }, "node_modules/@sentry/utils": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -1739,15 +1591,13 @@ }, "node_modules/@sentry/utils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -1757,9 +1607,8 @@ }, "node_modules/@solarity/hardhat-markup": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@solarity/hardhat-markup/-/hardhat-markup-1.0.8.tgz", - "integrity": "sha512-FYgm/G6oJfE/zY4zDRqyhYzZzdf9Jolri94G7MxuiaHLAGWX82AhiVNhImyNGOHUE3hk1x454qJa7OaHYVkvvg==", "dev": true, + "license": "MIT", "dependencies": { "json2md": "2.0.1", "lodash": "4.17.21", @@ -1771,11 +1620,15 @@ "hardhat": "^2.10.0" } }, + "node_modules/@solarity/hardhat-markup/node_modules/@solidity-parser/parser": { + "version": "0.17.0", + "dev": true, + "license": "MIT" + }, "node_modules/@solarity/hardhat-markup/node_modules/prettier": { "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -1786,17 +1639,42 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/@solarity/hardhat-markup/node_modules/prettier-plugin-solidity": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@solidity-parser/parser": "^0.17.0", + "semver": "^7.5.4", + "solidity-comments-extractor": "^0.0.8" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "prettier": ">=2.3.0" + } + }, + "node_modules/@solarity/hardhat-markup/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@solidity-parser/parser": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -1806,33 +1684,28 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typechain/ethers-v6": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", - "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.15", "ts-essentials": "^7.0.1" @@ -1845,9 +1718,8 @@ }, "node_modules/@typechain/hardhat": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", - "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", "dev": true, + "license": "MIT", "dependencies": { "fs-extra": "^9.1.0" }, @@ -1859,43 +1731,31 @@ } }, "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "version": "5.1.6", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", "dev": true }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", - "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "*" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -1903,87 +1763,77 @@ }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "version": "10.0.9", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.40", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.40.tgz", - "integrity": "sha512-MIxieZHrm4Ee8XArBIc+Or9HINt2StOmCbgRcXGSJl8q14svRvkZPe7LJq9HKtTI1SK3wU8b91TjntUm7T69Pg==", + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/@types/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/secp256k1": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@uniswap/lib": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-1.1.1.tgz", - "integrity": "sha512-2yK7sLpKIT91TiS5sewHtOa7YuM8IuBXVl4GZv2jZFys4D2sY7K5vZh6MqD25TPA95Od+0YzCVq6cTF2IKrOmg==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v2-core": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v2-periphery": { "version": "1.1.0-beta.0", - "resolved": "https://registry.npmjs.org/@uniswap/v2-periphery/-/v2-periphery-1.1.0-beta.0.tgz", - "integrity": "sha512-6dkwAMKza8nzqYiXEr2D86dgW3TTavUvCR0w2Tu33bAbM8Ah43LKAzH7oKKPRT5VJQaMi1jtkGs1E8JPor1n5g==", + "license": "GPL-3.0-or-later", "dependencies": { "@uniswap/lib": "1.1.1", "@uniswap/v2-core": "1.0.0" @@ -1994,24 +1844,21 @@ }, "node_modules/@uniswap/v2-periphery/node_modules/@uniswap/v2-core": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.0.tgz", - "integrity": "sha512-BJiXrBGnN8mti7saW49MXwxDBRFiWemGetE58q8zgfnPPzQKq55ADltEILqOt6VFZ22kVeVKbF8gVd8aY3l7pA==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-core": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", - "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", + "license": "BUSL-1.1", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-periphery": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", - "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7", "@uniswap/lib": "^4.0.1-alpha", @@ -2025,28 +1872,24 @@ }, "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + "license": "MIT" }, "node_modules/@uniswap/v3-periphery/node_modules/@uniswap/lib": { "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/abbrev": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/abitype": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -2064,10 +1907,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2076,10 +1918,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -2089,24 +1930,21 @@ }, "node_modules/adm-zip": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -2116,9 +1954,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2129,9 +1966,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2145,9 +1981,8 @@ }, "node_modules/amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, + "license": "BSD-3-Clause OR MIT", "optional": true, "engines": { "node": ">=0.4.2" @@ -2155,27 +1990,24 @@ }, "node_modules/ansi-align": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -2188,18 +2020,16 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -2208,19 +2038,17 @@ } }, "node_modules/antlr4": { - "version": "4.13.1-patch-1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1-patch-1.tgz", - "integrity": "sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow==", + "version": "4.13.2", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=16" } }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2231,30 +2059,26 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-back": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -2268,18 +2092,16 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.findlast": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2297,9 +2119,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -2319,54 +2140,47 @@ }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/ast-parents": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", - "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2378,10 +2192,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2389,51 +2202,44 @@ } }, "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true + "version": "1.6.7", + "dev": true, + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-sol": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" + "license": "MIT" }, "node_modules/bech32": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bignumber.js": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2443,10 +2249,9 @@ }, "node_modules/blake-hash": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", - "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^3.0.0", "node-gyp-build": "^4.2.2", @@ -2458,9 +2263,8 @@ }, "node_modules/blake2b": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", "dev": true, + "license": "ISC", "dependencies": { "blake2b-wasm": "^2.4.0", "nanoassert": "^2.0.0" @@ -2468,9 +2272,8 @@ }, "node_modules/blake2b-wasm": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", "dev": true, + "license": "MIT", "dependencies": { "b4a": "^1.0.1", "nanoassert": "^2.0.0" @@ -2478,21 +2281,18 @@ }, "node_modules/blakejs": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/boxen": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", @@ -2512,9 +2312,8 @@ }, "node_modules/boxen/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2527,9 +2326,8 @@ }, "node_modules/boxen/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2543,9 +2341,8 @@ }, "node_modules/boxen/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2555,24 +2352,21 @@ }, "node_modules/boxen/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/boxen/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/boxen/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2582,9 +2376,8 @@ }, "node_modules/boxen/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2594,9 +2387,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2604,9 +2396,8 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2616,27 +2407,23 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brotli-wasm": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-2.0.1.tgz", - "integrity": "sha512-+3USgYsC7bzb5yU0/p2HnnynZl0ak0E6uoIm4UW4Aby/8s8HFCq6NCfrrf1E9c3O8OCSzq3oYO1tUVqIi61Nww==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -2648,18 +2435,16 @@ }, "node_modules/bs58": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dev": true, + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -2668,45 +2453,39 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-reverse": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2722,9 +2501,8 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2741,18 +2519,16 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2761,10 +2537,9 @@ } }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "4.5.0", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -2772,7 +2547,7 @@ "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" }, "engines": { "node": ">=4" @@ -2780,9 +2555,8 @@ }, "node_modules/chai-as-promised": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", - "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "dev": true, + "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -2792,9 +2566,8 @@ }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2806,18 +2579,16 @@ }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -2826,40 +2597,28 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2867,9 +2626,8 @@ }, "node_modules/circomlibjs": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz", - "integrity": "sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg==", "dev": true, + "license": "GPL-3.0", "dependencies": { "blake-hash": "^2.0.0", "blake2b": "^2.1.3", @@ -2879,8 +2637,6 @@ }, "node_modules/circomlibjs/node_modules/ethers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, "funding": [ { @@ -2892,6 +2648,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -2927,18 +2684,16 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-boxes": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -2948,9 +2703,8 @@ }, "node_modules/cli-table3": { "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -2963,9 +2717,8 @@ }, "node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2974,24 +2727,21 @@ }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3001,15 +2751,13 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -3022,9 +2770,8 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -3037,42 +2784,37 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -3080,19 +2822,17 @@ }, "node_modules/cookie": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.39.0", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -3100,9 +2840,8 @@ }, "node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -3124,23 +2863,10 @@ } } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3151,9 +2877,8 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -3165,15 +2890,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.5", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3185,9 +2908,8 @@ }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3200,24 +2922,21 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/crypto-js": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3232,9 +2951,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3249,9 +2967,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3266,17 +2983,14 @@ }, "node_modules/death": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3289,9 +3003,8 @@ }, "node_modules/decamelize": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3301,9 +3014,8 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -3316,9 +3028,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3328,9 +3039,8 @@ }, "node_modules/deep-eql": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -3340,33 +3050,29 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3381,9 +3087,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3398,48 +3103,39 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/diff": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/difflib": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "dependencies": { "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3449,15 +3145,12 @@ }, "node_modules/dom-walk": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", "dev": true }, "node_modules/dotenv": { "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -3467,15 +3160,13 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3487,22 +3178,19 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "version": "4.12.1", + "dev": true, + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/enquirer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -3513,27 +3201,24 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -3591,9 +3276,8 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -3603,18 +3287,16 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3624,9 +3306,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -3638,18 +3319,16 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -3663,28 +3342,25 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^2.7.1", "estraverse": "^1.9.1", @@ -3704,9 +3380,8 @@ }, "node_modules/esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3717,8 +3392,6 @@ }, "node_modules/estraverse": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3726,64 +3399,35 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/ethereum-bloom-filters": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz", - "integrity": "sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==", + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { "@noble/hashes": "^1.4.0" } }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "dev": true, - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.5.0", "dev": true, - "dependencies": { - "@types/node": "*" + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-abi/node_modules/ethereum-cryptography": { + "node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3802,11 +3446,32 @@ "setimmediate": "^1.0.5" } }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.1", + "dev": true, + "license": "MIT" + }, "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -3819,9 +3484,8 @@ }, "node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -3833,33 +3497,8 @@ "node": ">=10.0.0" } }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/ethers": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz", - "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==", + "version": "6.13.4", "dev": true, "funding": [ { @@ -3871,54 +3510,32 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", + "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", + "tslib": "2.7.0", "ws": "8.17.1" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/ethers/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", "dev": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethers/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "undici-types": "~6.19.2" } }, - "node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true - }, "node_modules/ethjs-unit": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -3930,15 +3547,13 @@ }, "node_modules/ethjs-unit/node_modules/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ethjs-util": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dev": true, + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -3950,9 +3565,8 @@ }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -3960,21 +3574,18 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3988,36 +3599,31 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "version": "3.0.3", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/ffjavascript": { "version": "0.2.63", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz", - "integrity": "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==", "dev": true, + "license": "GPL-3.0", "dependencies": { "wasmbuilder": "0.0.16", "wasmcurves": "0.2.2", @@ -4026,9 +3632,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4038,9 +3643,8 @@ }, "node_modules/find-replace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.0.1" }, @@ -4050,9 +3654,8 @@ }, "node_modules/find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^2.0.0" }, @@ -4062,17 +3665,14 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", "dev": true, "funding": [ { @@ -4080,6 +3680,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4091,18 +3692,16 @@ }, "node_modules/for-each": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -4115,10 +3714,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4130,24 +3728,21 @@ }, "node_modules/form-data-encoder": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.17" } }, "node_modules/fp-ts": { "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -4160,38 +3755,21 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4207,36 +3785,32 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -4253,9 +3827,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4265,9 +3838,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -4282,9 +3854,8 @@ }, "node_modules/ghost-testrpc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "license": "ISC", "dependencies": { "chalk": "^2.4.2", "node-emoji": "^1.10.0" @@ -4295,10 +3866,8 @@ }, "node_modules/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4316,9 +3885,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4328,9 +3896,8 @@ }, "node_modules/global": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dev": true, + "license": "MIT", "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -4338,9 +3905,8 @@ }, "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -4350,9 +3916,8 @@ }, "node_modules/global-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -4364,9 +3929,8 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4380,9 +3944,8 @@ }, "node_modules/globby": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, + "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -4399,9 +3962,8 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4411,9 +3973,8 @@ }, "node_modules/got": { "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -4436,15 +3997,13 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -4463,22 +4022,20 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/hardhat": { - "version": "2.22.6", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.6.tgz", - "integrity": "sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==", + "version": "2.22.15", "dev": true, + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.4.1", + "@nomicfoundation/edr": "^0.6.4", "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", @@ -4491,7 +4048,7 @@ "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", @@ -4504,6 +4061,7 @@ "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", @@ -4538,9 +4096,8 @@ }, "node_modules/hardhat-contract-sizer": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", - "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "cli-table3": "^0.6.0", @@ -4552,9 +4109,8 @@ }, "node_modules/hardhat-contract-sizer/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4567,9 +4123,8 @@ }, "node_modules/hardhat-contract-sizer/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4583,9 +4138,8 @@ }, "node_modules/hardhat-contract-sizer/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4595,24 +4149,21 @@ }, "node_modules/hardhat-contract-sizer/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hardhat-contract-sizer/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hardhat-contract-sizer/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4621,10 +4172,9 @@ } }, "node_modules/hardhat-gas-reporter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.2.0.tgz", - "integrity": "sha512-eAlLWnyDpQ+wJXgSCZsM0yt+rQm3ryJia1I1Hoi94LzlIfuSPcsMQM12VO6UHmAFLvXvoKxXPJ3ZYk0Kz+7CDQ==", + "version": "2.2.1", "dev": true, + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -4646,11 +4196,57 @@ "hardhat": "^2.16.0" } }, + "node_modules/hardhat-gas-reporter/node_modules/@noble/curves": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@noble/hashes": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip39": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/hardhat-gas-reporter/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4663,18 +4259,16 @@ }, "node_modules/hardhat-gas-reporter/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/hardhat-gas-reporter/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4688,9 +4282,8 @@ }, "node_modules/hardhat-gas-reporter/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4700,15 +4293,24 @@ }, "node_modules/hardhat-gas-reporter/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } }, "node_modules/hardhat-gas-reporter/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -4726,18 +4328,16 @@ }, "node_modules/hardhat-gas-reporter/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hardhat-gas-reporter/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4750,9 +4350,8 @@ }, "node_modules/hardhat-gas-reporter/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4760,38 +4359,19 @@ "node": ">=8" } }, - "node_modules/hardhat/node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/hardhat/node_modules/@noble/hashes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/hardhat/node_modules/@scure/bip32": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, "funding": [ { @@ -4799,6 +4379,7 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -4807,8 +4388,6 @@ }, "node_modules/hardhat/node_modules/@scure/bip39": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, "funding": [ { @@ -4816,22 +4395,16 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" } }, - "node_modules/hardhat/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/hardhat/node_modules/ethereum-cryptography": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, + "license": "MIT", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -4839,58 +4412,10 @@ "@scure/bip39": "1.1.1" } }, - "node_modules/hardhat/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -4902,45 +4427,24 @@ }, "node_modules/hardhat/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/hardhat/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, - "node_modules/hardhat/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/hardhat/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -4959,27 +4463,24 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4989,9 +4490,8 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5001,9 +4501,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5013,9 +4512,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -5028,9 +4526,8 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -5042,9 +4539,8 @@ }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -5052,9 +4548,8 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -5064,24 +4559,21 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/heap": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -5090,15 +4582,13 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -5112,9 +4602,8 @@ }, "node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -5125,9 +4614,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -5137,12 +4625,11 @@ } }, "node_modules/husky": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", - "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", + "version": "9.1.6", "dev": true, + "license": "MIT", "bin": { - "husky": "bin.mjs" + "husky": "bin.js" }, "engines": { "node": ">=18" @@ -5153,9 +4640,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5165,31 +4651,27 @@ }, "node_modules/idb-keyval": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", "dev": true, + "license": "Apache-2.0", "peer": true }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", - "dev": true + "version": "4.3.7", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5203,25 +4685,21 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/indento": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", - "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5229,21 +4707,18 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -5255,27 +4730,24 @@ }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/io-ts": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dev": true, + "license": "MIT", "dependencies": { "fp-ts": "^1.0.0" } }, "node_modules/is-array-buffer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -5289,15 +4761,13 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -5307,9 +4777,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -5319,9 +4788,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5335,9 +4803,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5347,9 +4814,8 @@ }, "node_modules/is-data-view": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -5362,9 +4828,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5377,27 +4842,24 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5407,9 +4869,8 @@ }, "node_modules/is-hex-prefixed": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -5417,9 +4878,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5429,18 +4889,16 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5453,18 +4911,16 @@ }, "node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5478,9 +4934,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -5493,9 +4948,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5508,9 +4962,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -5523,9 +4976,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -5538,9 +4990,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5550,9 +5001,8 @@ }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -5562,20 +5012,16 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isows": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", "dev": true, "funding": [ { @@ -5583,15 +5029,15 @@ "url": "https://github.com/sponsors/wagmi-dev" } ], + "license": "MIT", "peerDependencies": { "ws": "*" } }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -5604,21 +5050,18 @@ }, "node_modules/js-sha3": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5628,36 +5071,39 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=7.10.1" + } }, "node_modules/json2md": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz", - "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==", "dev": true, + "license": "MIT", "dependencies": { "indento": "^1.1.13" } }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5667,9 +5113,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -5679,19 +5124,17 @@ }, "node_modules/jsonschema": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/keccak": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -5703,33 +5146,29 @@ }, "node_modules/keccak/node_modules/node-addon-api": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/latest-version": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dev": true, + "license": "MIT", "dependencies": { "package-json": "^8.1.0" }, @@ -5742,9 +5181,8 @@ }, "node_modules/levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -5755,15 +5193,13 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -5774,33 +5210,28 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -5814,9 +5245,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5829,9 +5259,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5845,9 +5274,8 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5857,24 +5285,21 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5884,18 +5309,16 @@ }, "node_modules/loupe": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5905,27 +5328,23 @@ }, "node_modules/lru_map": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/markdown-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "dev": true, + "license": "MIT", "dependencies": { "repeat-string": "^1.0.0" }, @@ -5936,9 +5355,8 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -5947,8 +5365,6 @@ }, "node_modules/memorystream": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" @@ -5956,18 +5372,16 @@ }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/merkletreejs": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.4.0.tgz", - "integrity": "sha512-a48Ta5kWiVNBgeEbZVMm6FB1hBlp6vEuou/XnZdlkmd2zq6NZR6Sh2j+kR1B0iOZIXrTMcigBYzZ39MLdYhm1g==", "dev": true, + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.1", "buffer-reverse": "^1.0.1", @@ -5981,15 +5395,13 @@ }, "node_modules/micro-ftch": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -6000,18 +5412,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6021,9 +5431,8 @@ }, "node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6033,8 +5442,6 @@ }, "node_modules/min-document": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dev": true, "dependencies": { "dom-walk": "^0.1.0" @@ -6042,21 +5449,18 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6066,27 +5470,24 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -6096,18 +5497,16 @@ }, "node_modules/mnemonist": { "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, + "license": "MIT", "dependencies": { "obliterator": "^2.0.0" } }, "node_modules/mocha": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", - "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", + "version": "10.8.2", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -6140,18 +5539,39 @@ }, "node_modules/mocha/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6161,9 +5581,8 @@ }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6177,10 +5596,8 @@ }, "node_modules/mocha/node_modules/glob": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6197,18 +5614,16 @@ }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -6221,9 +5636,8 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6231,17 +5645,10 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6254,9 +5661,8 @@ }, "node_modules/mocha/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -6269,18 +5675,27 @@ }, "node_modules/mocha/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6293,52 +5708,45 @@ }, "node_modules/mock-local-storage": { "version": "1.1.24", - "resolved": "https://registry.npmjs.org/mock-local-storage/-/mock-local-storage-1.1.24.tgz", - "integrity": "sha512-NEfmw+yEK9oe6xCfOnTaJ6Dz+L3eu6vsZopJlxflXYxr7Mg3EV+S0NXKUQlY9AAeDEdaPZDSUGq1Gi6kLSa5PA==", "dev": true, + "license": "MIT", "dependencies": { "core-js": "^3.30.2", "global": "^4.3.2" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "dev": true, + "license": "MIT" }, "node_modules/nanoassert": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-addon-api": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-emoji": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.21" } }, "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "version": "4.8.2", "dev": true, + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -6347,9 +5755,8 @@ }, "node_modules/nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -6359,18 +5766,16 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6380,9 +5785,8 @@ }, "node_modules/number-to-bn": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -6394,15 +5798,13 @@ }, "node_modules/number-to-bn/node_modules/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6412,18 +5814,16 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -6439,24 +5839,21 @@ }, "node_modules/obliterator": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -6471,33 +5868,29 @@ }, "node_modules/ordinal": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^1.0.0" }, @@ -6507,9 +5900,8 @@ }, "node_modules/p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -6519,9 +5911,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -6534,18 +5925,16 @@ }, "node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/package-json": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "dev": true, + "license": "MIT", "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", @@ -6560,16 +5949,25 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-json/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6579,9 +5977,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6597,42 +5994,37 @@ }, "node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -6646,27 +6038,24 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -6679,16 +6068,14 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6698,44 +6085,30 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/pony-cause": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -6743,9 +6116,8 @@ }, "node_modules/prettier": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -6758,9 +6130,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6769,14 +6140,12 @@ } }, "node_modules/prettier-plugin-solidity": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz", - "integrity": "sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==", + "version": "1.4.1", "dev": true, + "license": "MIT", "dependencies": { - "@solidity-parser/parser": "^0.17.0", - "semver": "^7.5.4", - "solidity-comments-extractor": "^0.0.8" + "@solidity-parser/parser": "^0.18.0", + "semver": "^7.5.4" }, "engines": { "node": ">=16" @@ -6785,46 +6154,45 @@ "prettier": ">=2.3.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz", - "integrity": "sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==", - "dev": true + "node_modules/prettier-plugin-solidity/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/proto-list": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -6839,13 +6207,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6855,18 +6223,16 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6879,9 +6245,8 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -6894,18 +6259,16 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6916,21 +6279,19 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.2", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -6941,9 +6302,8 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, @@ -6953,23 +6313,21 @@ }, "node_modules/reduce-flatten": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6980,9 +6338,8 @@ }, "node_modules/registry-auth-token": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, + "license": "MIT", "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, @@ -6992,9 +6349,8 @@ }, "node_modules/registry-url": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "dev": true, + "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -7007,36 +6363,32 @@ }, "node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, + "license": "MIT", "dependencies": { "path-parse": "^1.0.6" }, @@ -7046,24 +6398,21 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7076,9 +6425,8 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7086,9 +6434,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -7096,9 +6443,8 @@ }, "node_modules/rlp": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dev": true, + "license": "MPL-2.0", "dependencies": { "bn.js": "^5.2.0" }, @@ -7108,8 +6454,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7125,15 +6469,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -7149,8 +6493,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -7165,13 +6507,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -7186,15 +6528,13 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sc-istanbul": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "abbrev": "1.0.x", "async": "1.x", @@ -7217,19 +6557,16 @@ }, "node_modules/sc-istanbul/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -7243,18 +6580,16 @@ }, "node_modules/sc-istanbul/node_modules/has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/sc-istanbul/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7265,9 +6600,8 @@ }, "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7278,15 +6612,13 @@ }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^1.0.0" }, @@ -7296,57 +6628,67 @@ }, "node_modules/scrypt-js": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/secp256k1/node_modules/bn.js": { + "version": "4.12.1", + "dev": true, + "license": "MIT" + }, + "node_modules/secp256k1/node_modules/elliptic": { + "version": "6.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/secp256k1/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "version": "5.1.0", + "dev": true, + "license": "MIT" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "6.3.1", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7361,9 +6703,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7376,21 +6717,18 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7401,9 +6739,8 @@ }, "node_modules/sha1": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" @@ -7414,9 +6751,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7426,18 +6762,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -7452,9 +6786,8 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7470,9 +6803,8 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -7482,18 +6814,16 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -7508,9 +6838,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7523,9 +6852,8 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7535,15 +6863,13 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/solc": { "version": "0.8.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", - "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", "dev": true, + "license": "MIT", "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", @@ -7562,18 +6888,16 @@ }, "node_modules/solc/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/solhint": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-5.0.1.tgz", - "integrity": "sha512-QeQLS9HGCnIiibt+xiOa/+MuP7BWz9N7C5+Mj9pLHshdkNhuo3AzCpWmjfWVZBUuwIUO3YyCRVIcYLR3YOKGfg==", + "version": "5.0.3", "dev": true, + "license": "MIT", "dependencies": { "@solidity-parser/parser": "^0.18.0", "ajv": "^6.12.6", @@ -7603,9 +6927,8 @@ }, "node_modules/solhint-plugin-prettier": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.1.0.tgz", - "integrity": "sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw==", "dev": true, + "license": "MIT", "dependencies": { "@prettier/sync": "^0.3.0", "prettier-linter-helpers": "^1.0.0" @@ -7617,9 +6940,8 @@ }, "node_modules/solhint/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7632,18 +6954,16 @@ }, "node_modules/solhint/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/solhint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7657,9 +6977,8 @@ }, "node_modules/solhint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7669,25 +6988,21 @@ }, "node_modules/solhint/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/solhint/node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/solhint/node_modules/glob": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7704,18 +7019,16 @@ }, "node_modules/solhint/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/solhint/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7725,9 +7038,8 @@ }, "node_modules/solhint/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "optional": true, "bin": { "prettier": "bin-prettier.js" @@ -7739,11 +7051,21 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/solhint/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/solhint/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7753,24 +7075,21 @@ }, "node_modules/solidity-ast": { "version": "0.4.55", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.55.tgz", - "integrity": "sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==", "dev": true, + "license": "MIT", "dependencies": { "array.prototype.findlast": "^1.2.2" } }, "node_modules/solidity-comments-extractor": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz", - "integrity": "sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/solidity-coverage": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.12.tgz", - "integrity": "sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==", + "version": "0.8.13", "dev": true, + "license": "ISC", "dependencies": { "@ethersproject/abi": "^5.0.9", "@solidity-parser/parser": "^0.18.0", @@ -7801,9 +7120,8 @@ }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -7815,26 +7133,33 @@ }, "node_modules/solidity-coverage/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/solidity-coverage/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/source-map": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "dependencies": { @@ -7846,9 +7171,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7856,24 +7180,21 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stacktrace-parser": { "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.7.1" }, @@ -7883,42 +7204,37 @@ }, "node_modules/stacktrace-parser/node_modules/type-fest": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-format": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true + "dev": true, + "license": "WTFPL OR MIT" }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7931,9 +7247,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7945,9 +7260,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7963,9 +7277,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7977,9 +7290,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7994,9 +7306,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8007,9 +7318,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8019,18 +7329,16 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-hex-prefix": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dev": true, + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -8041,9 +7349,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -8053,9 +7360,8 @@ }, "node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -8065,9 +7371,8 @@ }, "node_modules/table": { "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -8081,9 +7386,8 @@ }, "node_modules/table-layout": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -8096,27 +7400,24 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/table/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8130,21 +7431,18 @@ }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -8154,9 +7452,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8166,27 +7463,24 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/treeify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/ts-command-line-args": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "license": "ISC", "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -8199,9 +7493,8 @@ }, "node_modules/ts-command-line-args/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8214,9 +7507,8 @@ }, "node_modules/ts-command-line-args/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8230,9 +7522,8 @@ }, "node_modules/ts-command-line-args/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8242,24 +7533,21 @@ }, "node_modules/ts-command-line-args/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ts-command-line-args/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ts-command-line-args/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8269,18 +7557,16 @@ }, "node_modules/ts-essentials": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, + "license": "MIT", "peerDependencies": { "typescript": ">=3.7.0" } }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -8321,18 +7607,16 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", @@ -8343,34 +7627,29 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "version": "2.7.0", + "dev": true, + "license": "0BSD" }, "node_modules/tsort": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/tweetnacl-util": { "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -8379,19 +7658,17 @@ } }, "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8401,9 +7678,8 @@ }, "node_modules/typechain": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -8425,9 +7701,8 @@ }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -8439,10 +7714,8 @@ }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8460,18 +7733,16 @@ }, "node_modules/typechain/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -8481,9 +7752,8 @@ }, "node_modules/typechain/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -8496,18 +7766,16 @@ }, "node_modules/typechain/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/typed-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -8519,9 +7787,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -8538,9 +7805,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -8558,9 +7824,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -8577,10 +7842,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.3", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8591,18 +7855,16 @@ }, "node_modules/typical": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/uglify-js": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", - "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", + "version": "3.19.3", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -8613,9 +7875,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -8628,9 +7889,8 @@ }, "node_modules/undici": { "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -8639,73 +7899,59 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.19.8", + "dev": true, + "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "8.3.2", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/viem": { "version": "2.7.14", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz", - "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==", "dev": true, "funding": [ { @@ -8713,6 +7959,7 @@ "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.0", "@noble/curves": "1.2.0", @@ -8734,66 +7981,13 @@ }, "node_modules/viem/node_modules/@adraffy/ens-normalize": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true - }, - "node_modules/viem/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dev": true, - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dev": true, - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dev": true, - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "license": "MIT" }, "node_modules/viem/node_modules/ws": { "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8812,30 +8006,26 @@ }, "node_modules/wasmbuilder": { "version": "0.0.16", - "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", - "dev": true + "dev": true, + "license": "GPL-3.0" }, "node_modules/wasmcurves": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", - "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", "dev": true, + "license": "GPL-3.0", "dependencies": { "wasmbuilder": "0.0.16" } }, "node_modules/web-worker": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/web3-utils": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", - "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", "dev": true, + "license": "LGPL-3.0", "dependencies": { "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", @@ -8850,11 +8040,68 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip32": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip39": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, "node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8864,9 +8111,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -8880,9 +8126,8 @@ }, "node_modules/which-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -8899,9 +8144,8 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, @@ -8911,24 +8155,21 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "license": "MIT", "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -8939,24 +8180,21 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/workerpool": { "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8972,9 +8210,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8989,9 +8226,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9004,9 +8240,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9016,15 +8251,13 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9037,9 +8270,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9049,21 +8281,18 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9082,18 +8311,16 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -9109,18 +8336,16 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -9133,18 +8358,16 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 6c619a44..2b92a18b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@solarity/solidity-lib", - "version": "2.7.11", + "version": "3.0.0", "license": "MIT", "author": "Distributed Lab", "readme": "README.md", @@ -26,16 +26,17 @@ "coverage": "npx hardhat coverage --solcoverjs ./.solcover.ts", "test": "npx hardhat test", "private-network": "npx hardhat node", - "lint-fix": "npm run lint-sol-fix && npm run lint-ts-fix && npm run lint-json-fix", + "lint-fix": "npm run lint-sol-fix && npm run lint-ts-fix && npm run lint-json-fix && npm run solhint-check", "lint-json-fix": "prettier --write \"./**/*.json\"", "lint-ts-fix": "prettier --write \"./**/*.ts\"", "lint-sol-fix": "prettier --write \"contracts/**/*.sol\"", + "solhint-check": "solhint \"./contracts/**/*.sol\"", "generate-docs": "npx hardhat markup", "publish-to-npm": "npm run lint-fix && bash ./scripts/publish.sh --public" }, "dependencies": { - "@openzeppelin/contracts": "4.9.6", - "@openzeppelin/contracts-upgradeable": "4.9.6", + "@openzeppelin/contracts": "5.1.0", + "@openzeppelin/contracts-upgradeable": "5.1.0", "@uniswap/v2-core": "1.0.1", "@uniswap/v2-periphery": "1.1.0-beta.0", "@uniswap/v3-core": "1.0.1", @@ -43,37 +44,34 @@ }, "devDependencies": { "@iden3/js-crypto": "^1.1.0", - "@iden3/js-merkletree": "^1.2.0", - "@metamask/eth-sig-util": "^7.0.3", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.7", - "@nomicfoundation/hardhat-ethers": "^3.0.6", - "@nomicfoundation/hardhat-network-helpers": "^1.0.10", + "@iden3/js-merkletree": "^1.3.1", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-network-helpers": "^1.0.12", "@solarity/hardhat-markup": "^1.0.8", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.7", + "@types/mocha": "^10.0.9", "@types/node": "^18.16.0", - "bignumber.js": "^9.1.2", "chai": "^4.4.1", - "ethers": "^6.13.1", "circomlibjs": "^0.1.7", "dotenv": "^16.4.5", - "hardhat": "^2.22.0", + "ethers": "^6.13.4", + "hardhat": "^2.22.15", "hardhat-contract-sizer": "^2.10.0", - "hardhat-gas-reporter": "^2.2.0", - "husky": "^9.0.11", + "hardhat-gas-reporter": "^2.2.1", + "husky": "^9.1.6", "merkletreejs": "^0.4.0", - "mocha": "^10.6.0", "mock-local-storage": "^1.1.24", "prettier": "^3.3.3", - "prettier-plugin-solidity": "^1.3.1", - "solhint": "^5.0.1", + "prettier-plugin-solidity": "^1.4.1", + "solhint": "^5.0.3", "solhint-plugin-prettier": "^0.1.0", - "solidity-coverage": "^0.8.12", + "solidity-coverage": "^0.8.13", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typechain": "^8.3.2", - "typescript": "^5.5.3" + "typescript": "^5.6.3" } } diff --git a/scripts/utils/constants.ts b/scripts/utils/constants.ts index 1a3e8e2e..945368e9 100644 --- a/scripts/utils/constants.ts +++ b/scripts/utils/constants.ts @@ -1,7 +1,5 @@ import { ethers } from "hardhat"; -export const ZERO_ADDR = "0x0000000000000000000000000000000000000000"; -export const ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000"; export const ETHER_ADDR = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; export const SECONDS_IN_DAY = 86400; diff --git a/test/access/MerkleWhitelisted.test.ts b/test/access/MerkleWhitelisted.test.ts index e394ae0c..c7e8a698 100644 --- a/test/access/MerkleWhitelisted.test.ts +++ b/test/access/MerkleWhitelisted.test.ts @@ -1,9 +1,10 @@ import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { MerkleTree } from "merkletreejs"; -import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; import { getRoot, getProof, buildTree } from "../helpers/merkle-tree-helper"; import { MerkleWhitelistedMock } from "@ethers-v6"; @@ -53,7 +54,7 @@ describe("MerkleWhitelisted", () => { }); it("should be zero if root is not set yet", async () => { - expect(await merkle.getMerkleRoot()).to.equal(ZERO_BYTES32); + expect(await merkle.getMerkleRoot()).to.equal(ethers.ZeroHash); }); it("should change merkle tree root properly", async () => { @@ -82,21 +83,27 @@ describe("MerkleWhitelisted", () => { }); it("should revert if the user is incorrect", async () => { - await expect( - merkle.connect(users[1]).onlyWhitelistedMethod(amounts[0], getProof(tree, leaves[0])), - ).to.be.revertedWith("MerkleWhitelisted: not whitelisted"); + const data = ethers.solidityPacked(["uint256", "address"], [amounts[0], users[1].address]); + + await expect(merkle.connect(users[1]).onlyWhitelistedMethod(amounts[0], getProof(tree, leaves[0]))) + .to.be.revertedWithCustomError(merkle, "LeafNotWhitelisted") + .withArgs(data); }); it("should revert if the amount is incorrect", async () => { - await expect( - merkle.connect(users[0]).onlyWhitelistedMethod(amounts[1], getProof(tree, leaves[0])), - ).to.be.revertedWith("MerkleWhitelisted: not whitelisted"); + const data = ethers.solidityPacked(["uint256", "address"], [amounts[1], users[0].address]); + + await expect(merkle.connect(users[0]).onlyWhitelistedMethod(amounts[1], getProof(tree, leaves[0]))) + .to.be.revertedWithCustomError(merkle, "LeafNotWhitelisted") + .withArgs(data); }); it("should revert if the proof is incorrect", async () => { - await expect( - merkle.connect(users[0]).onlyWhitelistedMethod(amounts[0], getProof(tree, leaves[1])), - ).to.be.revertedWith("MerkleWhitelisted: not whitelisted"); + const data = ethers.solidityPacked(["uint256", "address"], [amounts[0], users[0].address]); + + await expect(merkle.connect(users[0]).onlyWhitelistedMethod(amounts[0], getProof(tree, leaves[1]))) + .to.be.revertedWithCustomError(merkle, "LeafNotWhitelisted") + .withArgs(data); }); it("should not revert if all conditions are met", async () => { @@ -117,15 +124,15 @@ describe("MerkleWhitelisted", () => { }); it("should revert if the user is incorrect", async () => { - await expect(merkle.onlyWhitelistedUserMethod(getProof(tree, leaves[0]))).to.be.revertedWith( - "MerkleWhitelisted: not whitelisted", - ); + await expect(merkle.onlyWhitelistedUserMethod(getProof(tree, leaves[0]))) + .to.be.revertedWithCustomError(merkle, "UserNotWhitelisted") + .withArgs(OWNER.address); }); it("should revert if the proof is incorrect", async () => { - await expect(merkle.connect(users[0]).onlyWhitelistedUserMethod(getProof(tree, leaves[1]))).to.be.revertedWith( - "MerkleWhitelisted: not whitelisted", - ); + await expect(merkle.connect(users[0]).onlyWhitelistedUserMethod(getProof(tree, leaves[1]))) + .to.be.revertedWithCustomError(merkle, "UserNotWhitelisted") + .withArgs(users[0].address); }); it("should not revert if all conditions are met", async () => { diff --git a/test/access/MultiOwnable.test.ts b/test/access/MultiOwnable.test.ts index d10d5a66..49b37fef 100644 --- a/test/access/MultiOwnable.test.ts +++ b/test/access/MultiOwnable.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { MultiOwnableMock } from "@ethers-v6"; @@ -30,25 +31,26 @@ describe("MultiOwnable", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(multiOwnable.mockInit()).to.be.revertedWith("Initializable: contract is not initializing"); - await expect(multiOwnable.__MultiOwnableMock_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(multiOwnable.mockInit()).to.be.revertedWithCustomError(multiOwnable, "NotInitializing").withArgs(); + await expect(multiOwnable.__MultiOwnableMock_init()) + .to.be.revertedWithCustomError(multiOwnable, "InvalidInitialization") + .withArgs(); }); it("only owner should call these functions", async () => { - await expect(multiOwnable.connect(SECOND).addOwners([THIRD.address])).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(multiOwnable.connect(SECOND).addOwners([THIRD.address])) + .to.be.revertedWithCustomError(multiOwnable, "UnauthorizedAccount") + .withArgs(SECOND); await multiOwnable.addOwners([THIRD.address]); - await expect(multiOwnable.connect(SECOND).removeOwners([THIRD.address])).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); - await expect(multiOwnable.connect(SECOND).renounceOwnership()).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(multiOwnable.connect(SECOND).removeOwners([THIRD.address])) + .to.be.revertedWithCustomError(multiOwnable, "UnauthorizedAccount") + .withArgs(SECOND); + + await expect(multiOwnable.connect(SECOND).renounceOwnership()) + .to.be.revertedWithCustomError(multiOwnable, "UnauthorizedAccount") + .withArgs(SECOND); }); }); @@ -61,8 +63,9 @@ describe("MultiOwnable", () => { }); it("should not add null address", async () => { - await expect(multiOwnable.addOwners([ZERO_ADDR])).to.be.revertedWith( - "MultiOwnable: zero address can not be added", + await expect(multiOwnable.addOwners([ethers.ZeroAddress])).to.be.revertedWithCustomError( + multiOwnable, + "InvalidOwner", ); }); }); diff --git a/test/access/PermanentOwnable.test.ts b/test/access/PermanentOwnable.test.ts index 8e9be596..f4f75b15 100644 --- a/test/access/PermanentOwnable.test.ts +++ b/test/access/PermanentOwnable.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { PermanentOwnableMock } from "@ethers-v6"; @@ -33,16 +34,16 @@ describe("PermanentOwnable", () => { it("should reject zero address during the owner initialization", async () => { const permanentOwnableMock = await ethers.getContractFactory("PermanentOwnableMock"); - await expect(permanentOwnableMock.deploy(ZERO_ADDR)).to.be.revertedWith( - "PermanentOwnable: zero address can not be the owner", - ); + await expect(permanentOwnableMock.deploy(ethers.ZeroAddress)) + .to.be.revertedWithCustomError(permanentOwnable, "InvalidOwner") + .withArgs(); }); it("only owner should call this function", async () => { expect(await permanentOwnable.connect(OWNER).onlyOwnerMethod()).to.emit(permanentOwnable, "ValidOwner"); - await expect(permanentOwnable.connect(OTHER).onlyOwnerMethod()).to.be.revertedWith( - "PermanentOwnable: caller is not the owner", - ); + await expect(permanentOwnable.connect(OTHER).onlyOwnerMethod()) + .to.be.revertedWithCustomError(permanentOwnable, "UnauthorizedAccount") + .withArgs(OTHER); }); }); }); diff --git a/test/access/RBAC.test.ts b/test/access/RBAC.test.ts index eeff76c5..6e8f3396 100644 --- a/test/access/RBAC.test.ts +++ b/test/access/RBAC.test.ts @@ -1,6 +1,7 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { RBACMock } from "@ethers-v6"; @@ -28,7 +29,7 @@ describe("RBAC", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(rbac.mockInit()).to.be.revertedWith("Initializable: contract is not initializing"); + await expect(rbac.mockInit()).to.be.revertedWithCustomError(rbac, "NotInitializing").withArgs(); }); }); @@ -125,11 +126,11 @@ describe("RBAC", () => { describe("user roles", () => { describe("empty roles", () => { it("should not grant empty roles", async () => { - await expect(rbac.grantRoles(SECOND.address, [])).to.be.revertedWith("RBAC: empty roles"); + await expect(rbac.grantRoles(SECOND.address, [])).to.be.revertedWithCustomError(rbac, "EmptyRoles"); }); it("should not revoke empty roles", async () => { - await expect(rbac.revokeRoles(SECOND.address, [])).to.be.revertedWith("RBAC: empty roles"); + await expect(rbac.revokeRoles(SECOND.address, [])).to.be.revertedWithCustomError(rbac, "EmptyRoles"); }); }); @@ -340,22 +341,29 @@ describe("RBAC", () => { describe("access", () => { it("should not call these functions without permission", async () => { - await expect(rbac.connect(SECOND).grantRoles(OWNER.address, ["ROLE"])).to.be.revertedWith( - "RBAC: no CREATE permission for resource RBAC_RESOURCE", - ); - await expect(rbac.connect(SECOND).revokeRoles(OWNER.address, ["MASTER"])).to.be.revertedWith( - "RBAC: no DELETE permission for resource RBAC_RESOURCE", - ); + await expect(rbac.connect(SECOND).grantRoles(OWNER.address, ["ROLE"])) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "CREATE", "RBAC_RESOURCE"); + + await expect(rbac.connect(SECOND).revokeRoles(OWNER.address, ["MASTER"])) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "DELETE", "RBAC_RESOURCE"); + await expect( rbac .connect(SECOND) .addPermissionsToRole("ROLE", [{ resource: "resource", permissions: ["permission"] }], true), - ).to.be.revertedWith("RBAC: no CREATE permission for resource RBAC_RESOURCE"); + ) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "CREATE", "RBAC_RESOURCE"); + await expect( rbac .connect(SECOND) .removePermissionsFromRole("ROLE", [{ resource: "resource", permissions: ["permission"] }], false), - ).to.be.revertedWith("RBAC: no DELETE permission for resource RBAC_RESOURCE"); + ) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "DELETE", "RBAC_RESOURCE"); }); }); }); diff --git a/test/access/extensions/RBACGroupable.test.ts b/test/access/extensions/RBACGroupable.test.ts index 57d9cbed..13a279e8 100644 --- a/test/access/extensions/RBACGroupable.test.ts +++ b/test/access/extensions/RBACGroupable.test.ts @@ -1,6 +1,7 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { RBACGroupableMock } from "@ethers-v6"; @@ -28,7 +29,7 @@ describe("RBAC", () => { describe("__RBACGroupable_init", () => { it("should not initialize twice", async () => { - await expect(rbac.mockInit()).to.be.revertedWith("Initializable: contract is not initializing"); + await expect(rbac.mockInit()).to.be.revertedWithCustomError(rbac, "NotInitializing").withArgs(); }); }); @@ -90,13 +91,15 @@ describe("RBAC", () => { describe("grantGroupRoles", () => { it("should revert if no permission", async () => { - await expect(rbac.connect(SECOND).grantGroupRoles(GROUP_ALL_ROLES, ALL_ROLES)).to.be.revertedWith( - "RBAC: no CREATE permission for resource RBAC_RESOURCE", - ); + await expect(rbac.connect(SECOND).grantGroupRoles(GROUP_ALL_ROLES, ALL_ROLES)) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "CREATE", "RBAC_RESOURCE"); }); it("should revert if no roles provided", async () => { - await expect(rbac.grantGroupRoles(GROUP_ALL_ROLES, [])).to.be.revertedWith("RBACGroupable: empty roles"); + await expect(rbac.grantGroupRoles(GROUP_ALL_ROLES, [])) + .to.be.revertedWithCustomError(rbac, "EmptyRoles") + .withArgs(); }); it("should grant group roles if all conditions are met", async () => { @@ -118,13 +121,15 @@ describe("RBAC", () => { describe("revokeGroupRoles", () => { it("should revert if no permission", async () => { - await expect(rbac.connect(SECOND).revokeGroupRoles(GROUP_ALL_ROLES, ROLES_01)).to.be.rejectedWith( - "RBAC: no DELETE permission for resource RBAC_RESOURCE", - ); + await expect(rbac.connect(SECOND).revokeGroupRoles(GROUP_ALL_ROLES, ROLES_01)) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "DELETE", "RBAC_RESOURCE"); }); it("should revert if no roles provided", async () => { - await expect(rbac.revokeGroupRoles(GROUP_ALL_ROLES, [])).to.be.revertedWith("RBACGroupable: empty roles"); + await expect(rbac.revokeGroupRoles(GROUP_ALL_ROLES, [])) + .to.be.revertedWithCustomError(rbac, "EmptyRoles") + .withArgs(); }); it("should revoke group roles if all conditions are met", async () => { @@ -138,13 +143,15 @@ describe("RBAC", () => { describe("addUserToGroups", () => { it("should revert if no permission", async () => { - await expect( - rbac.connect(SECOND).addUserToGroups(SECOND.address, [GROUP_ROLES01, GROUP_ROLES12]), - ).to.be.rejectedWith("RBAC: no CREATE permission for resource RBAC_RESOURCE"); + await expect(rbac.connect(SECOND).addUserToGroups(SECOND.address, [GROUP_ROLES01, GROUP_ROLES12])) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "CREATE", "RBAC_RESOURCE"); }); it("should revert if no groups provided", async () => { - await expect(rbac.addUserToGroups(SECOND.address, [])).to.be.revertedWith("RBACGroupable: empty groups"); + await expect(rbac.addUserToGroups(SECOND.address, [])) + .to.be.revertedWithCustomError(rbac, "EmptyGroups") + .withArgs(); }); it("should add the user to groups if all conditions are met", async () => { @@ -158,9 +165,9 @@ describe("RBAC", () => { describe("toggleDefaultGroup", () => { it("should revert if no permission", async () => { - await expect(rbac.connect(SECOND).toggleDefaultGroup()).to.be.rejectedWith( - "RBAC: no UPDATE permission for resource RBAC_RESOURCE", - ); + await expect(rbac.connect(SECOND).toggleDefaultGroup()) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "UPDATE", "RBAC_RESOURCE"); }); it("should add the user to the default group automatically", async () => { @@ -191,15 +198,15 @@ describe("RBAC", () => { describe("removeUserFromGroups", () => { it("should revert if no permission", async () => { - await expect(rbac.connect(SECOND).removeUserFromGroups(SECOND.address, [GROUP_ROLES01])).to.be.revertedWith( - "RBAC: no DELETE permission for resource RBAC_RESOURCE", - ); + await expect(rbac.connect(SECOND).removeUserFromGroups(SECOND.address, [GROUP_ROLES01])) + .to.be.revertedWithCustomError(rbac, "NoPermissionForResource") + .withArgs(SECOND.address, "DELETE", "RBAC_RESOURCE"); }); it("should revert if no groups provided", async () => { - await expect(rbac.removeUserFromGroups(SECOND.address, [])).to.be.revertedWith( - "RBACGroupable: empty groups", - ); + await expect(rbac.removeUserFromGroups(SECOND.address, [])) + .to.be.revertedWithCustomError(rbac, "EmptyGroups") + .withArgs(); }); it("should remove the user from groups if all conditions are met", async () => { diff --git a/test/contracts-registry/ContractsRegistry.test.ts b/test/contracts-registry/ContractsRegistry.test.ts index 46d65f04..58564d5c 100644 --- a/test/contracts-registry/ContractsRegistry.test.ts +++ b/test/contracts-registry/ContractsRegistry.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { ContractsRegistryMock, DependantMock, DependantUpgradeMock, ERC20Mock } from "@ethers-v6"; @@ -29,10 +30,13 @@ describe("ContractsRegistry", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(contractsRegistry.mockInit()).to.be.revertedWith("Initializable: contract is not initializing"); - await expect(contractsRegistry.__OwnableContractsRegistry_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(contractsRegistry.mockInit()) + .to.be.revertedWithCustomError(contractsRegistry, "NotInitializing") + .withArgs(); + + await expect(contractsRegistry.__OwnableContractsRegistry_init()) + .to.be.revertedWithCustomError(contractsRegistry, "InvalidInitialization") + .withArgs(); }); it("should get proxy upgrader", async () => { @@ -40,66 +44,66 @@ describe("ContractsRegistry", () => { }); it("only owner should call these functions", async () => { - await expect(contractsRegistry.connect(SECOND).injectDependencies("")).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).injectDependencies("")) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).injectDependenciesWithData("", "0x")).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).injectDependenciesWithData("", "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).upgradeContract("", ZERO_ADDR)).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).upgradeContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).upgradeContractAndCall("", ZERO_ADDR, "0x")).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).upgradeContractAndCall("", ethers.ZeroAddress, "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).addContract("", ZERO_ADDR)).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).addProxyContract("", ZERO_ADDR)).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addProxyContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).addProxyContractAndCall("", ZERO_ADDR, "0x")).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addProxyContractAndCall("", ethers.ZeroAddress, "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).justAddProxyContract("", ZERO_ADDR)).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).justAddProxyContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(contractsRegistry.connect(SECOND).removeContract("")).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).removeContract("")) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); }); }); describe("contract management", async () => { - it("should fail adding ZERO_ADDR address", async () => { - await expect( - contractsRegistry.addContract(await contractsRegistry.DEPENDANT_NAME(), ZERO_ADDR), - ).to.be.revertedWith("ContractsRegistry: zero address is forbidden"); - - await expect( - contractsRegistry.addProxyContract(await contractsRegistry.DEPENDANT_NAME(), ZERO_ADDR), - ).to.be.revertedWith("ContractsRegistry: zero address is forbidden"); - - await expect( - contractsRegistry.justAddProxyContract(await contractsRegistry.DEPENDANT_NAME(), ZERO_ADDR), - ).to.be.revertedWith("ContractsRegistry: zero address is forbidden"); + it("should fail adding ethers.ZeroAddress address", async () => { + await expect(contractsRegistry.addContract(await contractsRegistry.DEPENDANT_NAME(), ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "ZeroAddressProvided") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); + + await expect(contractsRegistry.addProxyContract(await contractsRegistry.DEPENDANT_NAME(), ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "ZeroAddressProvided") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); + + await expect(contractsRegistry.justAddProxyContract(await contractsRegistry.DEPENDANT_NAME(), ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "ZeroAddressProvided") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); }); it("should add and remove the contract", async () => { const DependantMock = await ethers.getContractFactory("DependantMock"); const dependant = await DependantMock.deploy(); - await expect(contractsRegistry.removeContract(await contractsRegistry.DEPENDANT_NAME())).to.be.revertedWith( - "ContractsRegistry: this mapping doesn't exist", - ); + await expect(contractsRegistry.removeContract(await contractsRegistry.DEPENDANT_NAME())) + .to.be.revertedWithCustomError(contractsRegistry, "NoMappingExists") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); await contractsRegistry.addContract(await contractsRegistry.DEPENDANT_NAME(), await dependant.getAddress()); @@ -108,9 +112,10 @@ describe("ContractsRegistry", () => { await contractsRegistry.removeContract(await contractsRegistry.DEPENDANT_NAME()); - await expect(contractsRegistry.getDependantContract()).to.be.revertedWith( - "ContractsRegistry: this mapping doesn't exist", - ); + await expect(contractsRegistry.getDependantContract()) + .to.be.revertedWithCustomError(contractsRegistry, "NoMappingExists") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); + expect(await contractsRegistry.hasContract(await contractsRegistry.DEPENDANT_NAME())).to.be.false; }); @@ -118,9 +123,9 @@ describe("ContractsRegistry", () => { const DependantMock = await ethers.getContractFactory("DependantMock"); const _dependant = await DependantMock.deploy(); - await expect(contractsRegistry.getImplementation(await contractsRegistry.DEPENDANT_NAME())).to.be.revertedWith( - "ContractsRegistry: this mapping doesn't exist", - ); + await expect(contractsRegistry.getImplementation(await contractsRegistry.DEPENDANT_NAME())) + .to.be.revertedWithCustomError(contractsRegistry, "NoMappingExists") + .withArgs(await contractsRegistry.DEPENDANT_NAME()); await contractsRegistry.addProxyContract(await contractsRegistry.DEPENDANT_NAME(), await _dependant.getAddress()); @@ -186,16 +191,18 @@ describe("ContractsRegistry", () => { await contractsRegistry.addContract(await contractsRegistry.DEPENDANT_NAME(), await dependant.getAddress()); - await expect(contractsRegistry.getImplementation(await contractsRegistry.DEPENDANT_NAME())).to.be.revertedWith( - "ContractsRegistry: not a proxy contract", - ); + await expect(contractsRegistry.getImplementation(await contractsRegistry.DEPENDANT_NAME())) + .to.be.revertedWithCustomError(contractsRegistry, "NotAProxy") + .withArgs(await contractsRegistry.DEPENDANT_NAME(), await dependant.getAddress()); await expect( contractsRegistry.upgradeContract( await contractsRegistry.DEPENDANT_NAME(), await _dependantUpgrade.getAddress(), ), - ).to.be.revertedWith("ContractsRegistry: not a proxy contract"); + ) + .to.be.revertedWithCustomError(contractsRegistry, "NotAProxy") + .withArgs(await contractsRegistry.DEPENDANT_NAME(), await dependant.getAddress()); }); it("should upgrade the contract", async () => { @@ -218,9 +225,9 @@ describe("ContractsRegistry", () => { }); it("should not upgrade non existing contract", async () => { - await expect( - contractsRegistry.upgradeContract("RANDOM CONTRACT", await _dependantUpgrade.getAddress()), - ).to.be.revertedWith("ContractsRegistry: this mapping doesn't exist"); + await expect(contractsRegistry.upgradeContract("RANDOM CONTRACT", await _dependantUpgrade.getAddress())) + .to.be.revertedWithCustomError(contractsRegistry, "NoMappingExists") + .withArgs("RANDOM CONTRACT"); }); it("should upgrade and call the contract", async () => { @@ -258,7 +265,7 @@ describe("ContractsRegistry", () => { }); it("should inject dependencies", async () => { - expect(await dependant.token()).to.equal(ZERO_ADDR); + expect(await dependant.token()).to.equal(ethers.ZeroAddress); await contractsRegistry.injectDependencies(await contractsRegistry.DEPENDANT_NAME()); @@ -266,7 +273,7 @@ describe("ContractsRegistry", () => { }); it("should inject dependencies with data", async () => { - expect(await dependant.token()).to.equal(ZERO_ADDR); + expect(await dependant.token()).to.equal(ethers.ZeroAddress); await contractsRegistry.injectDependenciesWithData(await contractsRegistry.DEPENDANT_NAME(), "0x112233"); @@ -274,9 +281,9 @@ describe("ContractsRegistry", () => { }); it("should not inject dependencies", async () => { - await expect(contractsRegistry.injectDependencies("RANDOM CONTRACT")).to.be.revertedWith( - "ContractsRegistry: this mapping doesn't exist", - ); + await expect(contractsRegistry.injectDependencies("RANDOM CONTRACT")) + .to.be.revertedWithCustomError(contractsRegistry, "NoMappingExists") + .withArgs("RANDOM CONTRACT"); }); it("should not allow random users to inject dependencies", async () => { @@ -284,15 +291,17 @@ describe("ContractsRegistry", () => { expect(await dependant.getInjector()).to.equal(await contractsRegistry.getAddress()); - await expect(dependant.setDependencies(await contractsRegistry.getAddress(), "0x")).to.be.revertedWith( - "Dependant: not an injector", - ); + await expect(dependant.setDependencies(await contractsRegistry.getAddress(), "0x")) + .to.be.revertedWithCustomError(dependant, "NotAnInjector") + .withArgs(await contractsRegistry.getAddress(), OWNER.address); }); it("should not allow random users to set new injector", async () => { await contractsRegistry.injectDependencies(await contractsRegistry.DEPENDANT_NAME()); - await expect(dependant.setInjector(OWNER)).to.be.revertedWith("Dependant: not an injector"); + await expect(dependant.setInjector(OWNER)) + .to.be.revertedWithCustomError(dependant, "NotAnInjector") + .withArgs(await dependant.getInjector(), OWNER.address); }); }); }); diff --git a/test/contracts-registry/pools/PoolContractsRegistry.test.ts b/test/contracts-registry/pools/PoolContractsRegistry.test.ts index 6d012e2b..5ccb4dda 100644 --- a/test/contracts-registry/pools/PoolContractsRegistry.test.ts +++ b/test/contracts-registry/pools/PoolContractsRegistry.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { PoolContractsRegistryMock, ContractsRegistryPoolMock, PoolMock, PoolUpgradeMock, ERC20Mock } from "@ethers-v6"; @@ -60,31 +61,35 @@ describe("PoolContractsRegistry", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(poolContractsRegistry.__OwnablePoolContractsRegistry_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(poolContractsRegistry.__OwnablePoolContractsRegistry_init()) + .to.be.revertedWithCustomError(poolContractsRegistry, "InvalidInitialization") + .withArgs(); - await expect(poolContractsRegistry.mockInit()).to.be.revertedWith("Initializable: contract is not initializing"); + await expect(poolContractsRegistry.mockInit()) + .to.be.revertedWithCustomError(poolContractsRegistry, "NotInitializing") + .withArgs(); }); it("should not set dependencies from non dependant", async () => { - await expect(poolContractsRegistry.setDependencies(OWNER.address, "0x")).to.be.rejectedWith( - "Dependant: not an injector", - ); + const injector = await poolContractsRegistry.getInjector(); + + await expect(poolContractsRegistry.setDependencies(OWNER.address, "0x")) + .to.be.revertedWithCustomError(poolContractsRegistry, "NotAnInjector") + .withArgs(injector, OWNER.address); }); it("only owner should call these functions", async () => { - await expect(poolContractsRegistry.connect(SECOND).setNewImplementations([], [])).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(poolContractsRegistry.connect(SECOND).setNewImplementations([], [])) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect( - poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPools("", 0, 0), - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPools("", 0, 0)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect( - poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPoolsWithData("", "0x", 0, 0), - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPoolsWithData("", "0x", 0, 0)) + .to.be.revertedWithCustomError(contractsRegistry, "OwnableUnauthorizedAccount") + .withArgs(SECOND); }); }); @@ -93,16 +98,17 @@ describe("PoolContractsRegistry", () => { await poolContractsRegistry.setNewImplementations([NAME_1], [await token.getAddress()]); expect(await poolContractsRegistry.getImplementation(NAME_1)).to.equal(await token.getAddress()); - expect(await poolContractsRegistry.getProxyBeacon(NAME_1)).not.to.equal(ZERO_ADDR); + expect(await poolContractsRegistry.getProxyBeacon(NAME_1)).not.to.equal(ethers.ZeroAddress); }); it("should not get not existing implementation", async () => { - await expect(poolContractsRegistry.getImplementation(NAME_1)).to.be.revertedWith( - "PoolContractsRegistry: this mapping doesn't exist", - ); - await expect(poolContractsRegistry.getProxyBeacon(NAME_1)).to.be.revertedWith( - "PoolContractsRegistry: bad ProxyBeacon", - ); + await expect(poolContractsRegistry.getImplementation(NAME_1)) + .to.be.revertedWithCustomError(poolContractsRegistry, "NoMappingExists") + .withArgs(NAME_1); + + await expect(poolContractsRegistry.getProxyBeacon(NAME_1)) + .to.be.revertedWithCustomError(poolContractsRegistry, "ProxyDoesNotExist") + .withArgs(NAME_1); }); }); @@ -128,9 +134,9 @@ describe("PoolContractsRegistry", () => { }); it("only owner should be able to add pools", async () => { - await expect(poolContractsRegistry.connect(POOL_1).addProxyPool(NAME_1, POOL_1.address)).to.be.revertedWith( - "PoolContractsRegistry: not a factory", - ); + await expect(poolContractsRegistry.connect(POOL_1).addProxyPool(NAME_1, POOL_1.address)) + .to.be.revertedWithCustomError(poolContractsRegistry, "CallerNotAFactory") + .withArgs(POOL_1, OWNER.address); }); }); @@ -145,7 +151,7 @@ describe("PoolContractsRegistry", () => { it("should inject dependencies", async () => { await poolContractsRegistry.addProxyPool(NAME_1, await pool.getAddress()); - expect(await pool.token()).to.equal(ZERO_ADDR); + expect(await pool.token()).to.equal(ethers.ZeroAddress); await poolContractsRegistry.injectDependenciesToExistingPools(NAME_1, 0, 1); @@ -155,7 +161,7 @@ describe("PoolContractsRegistry", () => { it("should inject dependencies with data", async () => { await poolContractsRegistry.addProxyPool(NAME_1, await pool.getAddress()); - expect(await pool.token()).to.equal(ZERO_ADDR); + expect(await pool.token()).to.equal(ethers.ZeroAddress); await poolContractsRegistry.injectDependenciesToExistingPoolsWithData(NAME_1, "0x", 0, 1); @@ -163,9 +169,9 @@ describe("PoolContractsRegistry", () => { }); it("should not inject dependencies to 0 pools", async () => { - await expect(poolContractsRegistry.injectDependenciesToExistingPools(NAME_1, 0, 1)).to.be.revertedWith( - "PoolContractsRegistry: no pools to inject", - ); + await expect(poolContractsRegistry.injectDependenciesToExistingPools(NAME_1, 0, 1)) + .to.be.revertedWithCustomError(poolContractsRegistry, "NoPoolsToInject") + .withArgs(NAME_1); }); }); diff --git a/test/contracts-registry/pools/pool-factory/PoolFactory.test.ts b/test/contracts-registry/pools/pool-factory/PoolFactory.test.ts index 2d069df2..7f8317a7 100644 --- a/test/contracts-registry/pools/pool-factory/PoolFactory.test.ts +++ b/test/contracts-registry/pools/pool-factory/PoolFactory.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { PoolFactoryMock, @@ -72,7 +73,9 @@ describe("PoolFactory", () => { describe("access", () => { it("should not set dependencies from non dependant", async () => { - await expect(poolFactory.setDependencies(OWNER, "0x")).to.be.revertedWith("Dependant: not an injector"); + await expect(poolFactory.setDependencies(OWNER, "0x")) + .to.be.revertedWithCustomError(poolFactory, "NotAnInjector") + .withArgs(await poolContractsRegistry.getInjector(), OWNER.address); }); }); @@ -100,14 +103,16 @@ describe("PoolFactory", () => { const beaconProxy = PublicBeaconProxy.attach(await pool.getAddress()); expect(await beaconProxy.implementation()).to.equal(await poolImpl.getAddress()); - expect(await pool.token()).not.to.equal(ZERO_ADDR); + expect(await pool.token()).not.to.equal(ethers.ZeroAddress); }); it("should not register pools", async () => { await contractsRegistry.addContract(await contractsRegistry.POOL_FACTORY_NAME(), OWNER); await contractsRegistry.injectDependencies(await contractsRegistry.POOL_CONTRACTS_REGISTRY_NAME()); - await expect(poolFactory.deployPool()).to.be.revertedWith("PoolContractsRegistry: not a factory"); + await expect(poolFactory.deployPool()) + .to.be.revertedWithCustomError(poolContractsRegistry, "CallerNotAFactory") + .withArgs(await poolFactory.getAddress(), OWNER.address); }); it("should deploy several pools", async () => { @@ -124,12 +129,13 @@ describe("PoolFactory", () => { const PoolMock = await ethers.getContractFactory("PoolMock"); const pool = PoolMock.attach((await poolContractsRegistry.listPools(NAME_1, 0, 1))[0]); - await expect(poolContractsRegistry.addProxyPool(NAME_1, await poolFactory.getAddress())).to.be.revertedWith( - "PoolContractsRegistry: not a factory", - ); - await expect(pool.setDependencies(await contractsRegistry.getAddress(), "0x")).to.be.revertedWith( - "Dependant: not an injector", - ); + await expect(poolContractsRegistry.addProxyPool(NAME_1, await poolFactory.getAddress())) + .to.be.revertedWithCustomError(poolContractsRegistry, "CallerNotAFactory") + .withArgs(OWNER.address, await poolFactory.getAddress()); + + await expect(pool.setDependencies(await contractsRegistry.getAddress(), "0x")) + .to.be.revertedWithCustomError(poolFactory, "NotAnInjector") + .withArgs(await pool.getInjector(), OWNER.address); }); it("should upgrade pools", async () => { diff --git a/test/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistry.test.ts b/test/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistry.test.ts index b571556d..6c9fc876 100644 --- a/test/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistry.test.ts +++ b/test/contracts-registry/pools/presets/MultiOwnablePoolContractsRegistry.test.ts @@ -1,6 +1,7 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { MultiOwnablePoolContractsRegistryMock } from "@ethers-v6"; @@ -29,23 +30,23 @@ describe("MultiOwnablePoolContractsRegistry", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(poolContractsRegistry.__MultiOwnablePoolContractsRegistry_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(poolContractsRegistry.__MultiOwnablePoolContractsRegistry_init()) + .to.be.revertedWithCustomError(poolContractsRegistry, "InvalidInitialization") + .withArgs(); }); it("only owner should call these functions", async () => { - await expect(poolContractsRegistry.connect(SECOND).setNewImplementations([], [])).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(poolContractsRegistry.connect(SECOND).setNewImplementations([], [])) + .to.be.revertedWithCustomError(poolContractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect( - poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPools("", 0, 0), - ).to.be.revertedWith("MultiOwnable: caller is not the owner"); + await expect(poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPools("", 0, 0)) + .to.be.revertedWithCustomError(poolContractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect( - poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPoolsWithData("", "0x", 0, 0), - ).to.be.revertedWith("MultiOwnable: caller is not the owner"); + await expect(poolContractsRegistry.connect(SECOND).injectDependenciesToExistingPoolsWithData("", "0x", 0, 0)) + .to.be.revertedWithCustomError(poolContractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); }); }); diff --git a/test/contracts-registry/presets/MultiOwnableContractsRegistry.test.ts b/test/contracts-registry/presets/MultiOwnableContractsRegistry.test.ts index 1ba2ff22..0133f914 100644 --- a/test/contracts-registry/presets/MultiOwnableContractsRegistry.test.ts +++ b/test/contracts-registry/presets/MultiOwnableContractsRegistry.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { MultiOwnableContractsRegistry } from "@ethers-v6"; @@ -28,47 +29,47 @@ describe("MultiOwnableContractsRegistry", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(contractsRegistry.__MultiOwnableContractsRegistry_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(contractsRegistry.__MultiOwnableContractsRegistry_init()) + .to.be.revertedWithCustomError(contractsRegistry, "InvalidInitialization") + .withArgs(); }); it("only owner should call these functions", async () => { - await expect(contractsRegistry.connect(SECOND).injectDependencies("")).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).injectDependencies("")) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).injectDependenciesWithData("", "0x")).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).injectDependenciesWithData("", "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).upgradeContract("", ZERO_ADDR)).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).upgradeContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).upgradeContractAndCall("", ZERO_ADDR, "0x")).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).upgradeContractAndCall("", ethers.ZeroAddress, "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).addContract("", ZERO_ADDR)).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).addProxyContract("", ZERO_ADDR)).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addProxyContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).addProxyContractAndCall("", ZERO_ADDR, "0x")).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).addProxyContractAndCall("", ethers.ZeroAddress, "0x")) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).justAddProxyContract("", ZERO_ADDR)).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).justAddProxyContract("", ethers.ZeroAddress)) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); - await expect(contractsRegistry.connect(SECOND).removeContract("")).to.be.revertedWith( - "MultiOwnable: caller is not the owner", - ); + await expect(contractsRegistry.connect(SECOND).removeContract("")) + .to.be.revertedWithCustomError(contractsRegistry, "UnauthorizedAccount") + .withArgs(SECOND.address); }); }); @@ -78,17 +79,17 @@ describe("MultiOwnableContractsRegistry", () => { await expect(contractsRegistry.injectDependenciesWithData("", "0x")).to.be.reverted; - await expect(contractsRegistry.upgradeContract("", ZERO_ADDR)).to.be.reverted; + await expect(contractsRegistry.upgradeContract("", ethers.ZeroAddress)).to.be.reverted; - await expect(contractsRegistry.upgradeContractAndCall("", ZERO_ADDR, "0x")).to.be.reverted; + await expect(contractsRegistry.upgradeContractAndCall("", ethers.ZeroAddress, "0x")).to.be.reverted; - await expect(contractsRegistry.addContract("", ZERO_ADDR)).to.be.reverted; + await expect(contractsRegistry.addContract("", ethers.ZeroAddress)).to.be.reverted; - await expect(contractsRegistry.addProxyContract("", ZERO_ADDR)).to.be.reverted; + await expect(contractsRegistry.addProxyContract("", ethers.ZeroAddress)).to.be.reverted; - await expect(contractsRegistry.addProxyContractAndCall("", ZERO_ADDR, "0x")).to.be.reverted; + await expect(contractsRegistry.addProxyContractAndCall("", ethers.ZeroAddress, "0x")).to.be.reverted; - await expect(contractsRegistry.justAddProxyContract("", ZERO_ADDR)).to.be.reverted; + await expect(contractsRegistry.justAddProxyContract("", ethers.ZeroAddress)).to.be.reverted; await expect(contractsRegistry.removeContract("")).to.be.reverted; }); diff --git a/test/diamond/Diamond.test.ts b/test/diamond/Diamond.test.ts index 230a2b49..aef9d779 100644 --- a/test/diamond/Diamond.test.ts +++ b/test/diamond/Diamond.test.ts @@ -1,9 +1,10 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { getSelectors, FacetAction } from "@/test/helpers/diamond-helper"; -import { ZERO_ADDR, ZERO_BYTES32 } from "@/scripts/utils/constants"; import { wei } from "@/scripts/utils/utils"; import { OwnableDiamondMock, DummyFacetMock, DummyInitMock, Diamond } from "@ethers-v6"; @@ -31,15 +32,15 @@ describe("Diamond", () => { describe("access", () => { it("should initialize only once", async () => { - await expect(diamond.__OwnableDiamondMock_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(diamond.__OwnableDiamondMock_init()) + .to.be.revertedWithCustomError(diamond, "AlreadyInitialized") + .withArgs(); }); it("should initialize only by top level contract", async () => { - await expect(diamond.__OwnableDiamondDirect_init()).to.be.revertedWith( - "Initializable: contract is not initializing", - ); + await expect(diamond.__OwnableDiamondDirect_init()) + .to.be.revertedWithCustomError(diamond, "NotInitializing") + .withArgs(); }); }); @@ -57,21 +58,25 @@ describe("Diamond", () => { it("should renounce ownership", async () => { await diamond.renounceOwnership(); - expect(await diamond.owner()).to.equal(ZERO_ADDR); + expect(await diamond.owner()).to.equal(ethers.ZeroAddress); }); it("should not transfer ownership from non-owner", async () => { - await expect(diamond.connect(SECOND).transferOwnership(SECOND.address)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).transferOwnership(SECOND.address)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); }); it("should not renounce ownership from non-owner", async () => { - await expect(diamond.connect(SECOND).renounceOwnership()).to.be.revertedWith("DiamondOwnable: not an owner"); + await expect(diamond.connect(SECOND).renounceOwnership()) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); }); it("should not transfer ownership to zero address", async () => { - await expect(diamond.transferOwnership(ZERO_ADDR)).to.be.revertedWith("DiamondOwnable: zero address owner"); + await expect(diamond.transferOwnership(ethers.ZeroAddress)) + .to.be.revertedWithCustomError(diamond, "InvalidOwner") + .withArgs(); }); }); @@ -92,7 +97,7 @@ describe("Diamond", () => { expect(await diamond.facets()).to.deep.equal([]); expect(await diamond.facetFunctionSelectors(await dummyFacet.getAddress())).to.deep.equal([]); expect(await diamond.facetAddresses()).to.deep.equal([]); - expect(await diamond.facetAddress("0x11223344")).to.equal(ZERO_ADDR); + expect(await diamond.facetAddress("0x11223344")).to.equal(ethers.ZeroAddress); }); }); @@ -126,25 +131,18 @@ describe("Diamond", () => { expect(await dummyFacet.getDummyString()).to.be.equal("dummy facet initialized"); }); - it("should revert if init address is not contract", async () => { - const init = dummyInit.init.fragment.selector; - await expect(diamond.diamondCutLong(facets, SECOND, init)).to.be.revertedWith( - "Diamond: init_ address has no code", - ); - }); - it("should revert if init function reverted", async () => { const initWithError = dummyInit.initWithError.fragment.selector; - await expect(diamond.diamondCutLong(facets, await dummyInit.getAddress(), initWithError)).to.be.revertedWith( - "Diamond: initialization function reverted", - ); + await expect(diamond.diamondCutLong(facets, await dummyInit.getAddress(), initWithError)) + .to.be.revertedWithCustomError(diamond, "InitializationReverted") + .withArgs(await dummyInit.getAddress(), initWithError); }); it("should revert if init function reverted with message", async () => { const initWithErrorMsg = dummyInit.initWithErrorMsg.fragment.selector; - await expect(diamond.diamondCutLong(facets, await dummyInit.getAddress(), initWithErrorMsg)).to.be.revertedWith( - "DiamondInit: init error", - ); + await expect(diamond.diamondCutLong(facets, await dummyInit.getAddress(), initWithErrorMsg)) + .to.be.revertedWithCustomError(dummyInit, "InitError") + .withArgs(); }); }); @@ -162,43 +160,44 @@ describe("Diamond", () => { it("should add facet correctly", async () => { const tx = diamond.diamondCutShort(facets); - await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ZERO_ADDR, "0x"); + await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ethers.ZeroAddress, "0x"); expect(await diamond.facets()).to.deep.equal([[await dummyFacet.getAddress(), selectors]]); expect(await diamond.facetFunctionSelectors(await dummyFacet.getAddress())).to.deep.equal(selectors); expect(await diamond.facetAddresses()).to.deep.equal([await dummyFacet.getAddress()]); expect(await diamond.facetAddress(selectors[0])).to.equal(await dummyFacet.getAddress()); - expect(await diamond.facetAddress("0x11223344")).to.equal(ZERO_ADDR); + expect(await diamond.facetAddress("0x11223344")).to.equal(ethers.ZeroAddress); }); it("should not add facet with zero address", async () => { - facets[0].facetAddress = ZERO_ADDR; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: facet cannot be zero address"); - }); - - it("should not add non-contract as a facet", async () => { - facets[0].facetAddress = SECOND.address; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: facet is not a contract"); + facets[0].facetAddress = ethers.ZeroAddress; + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "FacetIsZeroAddress") + .withArgs(); }); it("should not add facet when no selectors provided", async () => { facets[0].functionSelectors = []; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: no selectors provided"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "NoSelectorsProvided") + .withArgs(); }); it("only owner should add facets", async () => { - await expect(diamond.connect(SECOND).diamondCutShort(facets)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); - await expect(diamond.connect(SECOND).diamondCutLong(facets, ZERO_ADDR, ZERO_BYTES32)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutLong(facets, ethers.ZeroAddress, ethers.ZeroHash)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); }); it("should not add duplicate selectors", async () => { await diamond.diamondCutShort(facets); - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: selector already added"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "SelectorAlreadyAdded") + .withArgs(facets[0].facetAddress, selectors[0]); }); }); @@ -222,13 +221,13 @@ describe("Diamond", () => { facets[0].functionSelectors = selectors.slice(1); const tx = diamond.diamondCutShort(facets); - await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ZERO_ADDR, "0x"); + await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ethers.ZeroAddress, "0x"); expect(await diamond.facets()).to.deep.equal([[await dummyFacet.getAddress(), [selectors[0]]]]); expect(await diamond.facetAddresses()).to.deep.equal([await dummyFacet.getAddress()]); expect(await diamond.facetFunctionSelectors(await dummyFacet.getAddress())).to.deep.equal([selectors[0]]); expect(await diamond.facetAddress(selectors[0])).to.equal(await dummyFacet.getAddress()); - expect(await diamond.facetAddress(selectors[1])).to.equal(ZERO_ADDR); + expect(await diamond.facetAddress(selectors[1])).to.equal(ethers.ZeroAddress); }); it("should fully remove facets", async () => { @@ -238,22 +237,26 @@ describe("Diamond", () => { facets[0].action = FacetAction.Remove; const tx = diamond.diamondCutShort(facets); - await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ZERO_ADDR, "0x"); + await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ethers.ZeroAddress, "0x"); expect(await diamond.facets()).to.deep.equal([]); expect(await diamond.facetAddresses()).to.deep.equal([]); expect(await diamond.facetFunctionSelectors(await dummyFacet.getAddress())).to.deep.equal([]); - expect(await diamond.facetAddress(selectors[0])).to.equal(ZERO_ADDR); + expect(await diamond.facetAddress(selectors[0])).to.equal(ethers.ZeroAddress); }); it("should not remove facet when facet is zero address", async () => { - facets[0].facetAddress = ZERO_ADDR; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: facet cannot be zero address"); + facets[0].facetAddress = ethers.ZeroAddress; + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "FacetIsZeroAddress") + .withArgs(); }); it("should not remove facet when no selectors provided", async () => { facets[0].functionSelectors = []; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: no selectors provided"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "NoSelectorsProvided") + .withArgs(); }); it("should not remove selectors from another facet", async () => { @@ -263,17 +266,19 @@ describe("Diamond", () => { facets[0].action = FacetAction.Remove; facets[0].facetAddress = await diamond.getAddress(); - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: selector from another facet"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "SelectorFromAnotherFacet") + .withArgs(facets[0].functionSelectors[0]); }); it("only owner should remove facets", async () => { - await expect(diamond.connect(SECOND).diamondCutShort(facets)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); - await expect(diamond.connect(SECOND).diamondCutLong(facets, ZERO_ADDR, ZERO_BYTES32)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutLong(facets, ethers.ZeroAddress, ethers.ZeroHash)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); }); }); @@ -301,7 +306,7 @@ describe("Diamond", () => { const tx = diamond.diamondCutShort(facets); - await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ZERO_ADDR, "0x"); + await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ethers.ZeroAddress, "0x"); expect(await diamond.facets()).to.deep.equal([ [await dummyFacet.getAddress(), [selectors[0]]], @@ -324,7 +329,7 @@ describe("Diamond", () => { const tx = diamond.diamondCutShort(facets); - await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ZERO_ADDR, "0x"); + await expect(tx).to.emit(diamond, "DiamondCut").withArgs(facets.map(Object.values), ethers.ZeroAddress, "0x"); expect(await diamond.facets()).to.deep.equal([[await dummyFacet2.getAddress(), selectors]]); expect(await diamond.facetFunctionSelectors(await dummyFacet.getAddress())).to.deep.equal([]); @@ -333,18 +338,17 @@ describe("Diamond", () => { }); it("should not replace facet when facet is zero address", async () => { - facets[0].facetAddress = ZERO_ADDR; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: facet cannot be zero address"); - }); - - it("should not replace non-contract as a facet", async () => { - facets[0].facetAddress = SECOND.address; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: facet is not a contract"); + facets[0].facetAddress = ethers.ZeroAddress; + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "FacetIsZeroAddress") + .withArgs(); }); it("should not replace facet when no selectors provided", async () => { facets[0].functionSelectors = []; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: no selectors provided"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "NoSelectorsProvided") + .withArgs(); }); it("should not replace facet with the same facet", async () => { @@ -352,7 +356,9 @@ describe("Diamond", () => { await diamond.diamondCutShort(facets); facets[0].action = FacetAction.Replace; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: cannot replace to the same facet"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "SelectorIsAlreadyInThisFaucet") + .withArgs(facets[0].functionSelectors[0], facets[0].facetAddress); }); it("should not replace facet if selector is not registered", async () => { @@ -362,17 +368,19 @@ describe("Diamond", () => { facets[0].action = FacetAction.Replace; // set random selector facets[0].functionSelectors = ["0x00000000"]; - await expect(diamond.diamondCutShort(facets)).to.be.revertedWith("Diamond: no facet found for selector"); + await expect(diamond.diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "NoFacetForSelector") + .withArgs(facets[0].functionSelectors[0]); }); it("only owner should replace facets", async () => { - await expect(diamond.connect(SECOND).diamondCutShort(facets)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutShort(facets)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); - await expect(diamond.connect(SECOND).diamondCutLong(facets, ZERO_ADDR, ZERO_BYTES32)).to.be.revertedWith( - "DiamondOwnable: not an owner", - ); + await expect(diamond.connect(SECOND).diamondCutLong(facets, ethers.ZeroAddress, ethers.ZeroHash)) + .to.be.revertedWithCustomError(diamond, "CallerNotOwner") + .withArgs(SECOND.address, OWNER.address); }); }); @@ -415,7 +423,9 @@ describe("Diamond", () => { const DummyFacetMock = await ethers.getContractFactory("DummyFacetMock"); const facet = DummyFacetMock.attach(await diamond.getAddress()); - await expect(facet.getDummyString()).to.be.revertedWith("Diamond: selector is not registered"); + await expect(facet.getDummyString()) + .to.be.revertedWithCustomError(diamond, "SelectorNotRegistered") + .withArgs(getSelectors(facet.interface)[1]); }); it("should not receive ether if receive is not added", async () => { @@ -424,7 +434,9 @@ describe("Diamond", () => { value: wei("1"), }; - await expect(OWNER.sendTransaction(tx)).to.be.revertedWith("Diamond: selector is not registered"); + await expect(OWNER.sendTransaction(tx)) + .to.be.revertedWithCustomError(diamond, "SelectorNotRegistered") + .withArgs("0x00000000"); }); }); }); diff --git a/test/diamond/DiamondAccessControl.ts b/test/diamond/DiamondAccessControl.ts index 2fd71f06..d2bb815e 100644 --- a/test/diamond/DiamondAccessControl.ts +++ b/test/diamond/DiamondAccessControl.ts @@ -1,16 +1,16 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { getSelectors, FacetAction } from "@/test/helpers/diamond-helper"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; import { OwnableDiamondMock, Diamond, DiamondAccessControlMock } from "@ethers-v6"; describe("DiamondAccessControl", () => { const reverter = new Reverter(); - const ADMIN_ROLE = ZERO_BYTES32; + const ADMIN_ROLE = ethers.ZeroHash; const AGENT_ROLE = "0x0000000000000000000000000000000000000000000000000000000000000001"; let OWNER: SignerWithAddress; @@ -20,10 +20,6 @@ describe("DiamondAccessControl", () => { let access: DiamondAccessControlMock; let diamond: OwnableDiamondMock; - const hasRoleErrorMessage = async (account: SignerWithAddress, role: string) => { - return `AccessControl: account ${(await account.getAddress()).toLowerCase()} is missing role ${role}`; - }; - before("setup", async () => { [OWNER, SECOND, THIRD] = await ethers.getSigners(); @@ -56,30 +52,32 @@ describe("DiamondAccessControl", () => { describe("access", () => { it("should initialize only once", async () => { - await expect(access.__DiamondAccessControlMock_init()).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(access.__DiamondAccessControlMock_init()) + .to.be.revertedWithCustomError(diamond, "AlreadyInitialized") + .withArgs(); }); it("should initialize only by top level contract", async () => { - await expect(access.__DiamondAccessControlDirect_init()).to.be.revertedWith( - "Initializable: contract is not initializing", - ); + await expect(access.__DiamondAccessControlDirect_init()) + .to.be.revertedWithCustomError(diamond, "NotInitializing") + .withArgs(); }); }); describe("DiamondAccessControl functions", () => { describe("grantRole", async () => { it("should not grant role if not admin", async () => { - await expect(access.connect(SECOND).grantRole(AGENT_ROLE, SECOND)).to.be.revertedWith( - await hasRoleErrorMessage(SECOND, ADMIN_ROLE), - ); + await expect(access.connect(SECOND).grantRole(AGENT_ROLE, SECOND)) + .to.be.revertedWithCustomError(access, "RoleNotGranted") + .withArgs(await access.getRoleAdmin(AGENT_ROLE), SECOND); }); it("should not grant role if it's granted", async () => { await access.grantRole(AGENT_ROLE, SECOND); - await expect(access.grantRole(AGENT_ROLE, SECOND)).to.be.revertedWith("AccessControl: role is granted"); + await expect(access.grantRole(AGENT_ROLE, SECOND)) + .to.be.revertedWithCustomError(access, "RoleAlreadyGranted") + .withArgs(AGENT_ROLE, SECOND); }); it("should grant role if all conditions are met", async () => { @@ -95,15 +93,17 @@ describe("DiamondAccessControl", () => { }); it("should not revoke role if not admin", async () => { - await expect(access.connect(SECOND).revokeRole(AGENT_ROLE, SECOND)).to.be.revertedWith( - await hasRoleErrorMessage(SECOND, ADMIN_ROLE), - ); + await expect(access.connect(SECOND).revokeRole(AGENT_ROLE, SECOND)) + .to.be.revertedWithCustomError(access, "RoleNotGranted") + .withArgs(await access.getRoleAdmin(AGENT_ROLE), SECOND); }); it("should not revoke role if it's not granted", async () => { await access.revokeRole(AGENT_ROLE, SECOND); - await expect(access.revokeRole(AGENT_ROLE, SECOND)).to.be.revertedWith("AccessControl: role is not granted"); + await expect(access.revokeRole(AGENT_ROLE, SECOND)) + .to.be.revertedWithCustomError(access, "RoleNotGranted") + .withArgs(AGENT_ROLE, SECOND); }); it("should revoke role if all conditions are met", async () => { @@ -119,9 +119,9 @@ describe("DiamondAccessControl", () => { }); it("should not renounce role if not self", async () => { - await expect(access.renounceRole(AGENT_ROLE, SECOND)).to.be.revertedWith( - "AccessControl: can only renounce roles for self", - ); + await expect(access.renounceRole(AGENT_ROLE, SECOND)) + .to.be.revertedWithCustomError(access, "UnauthorizedAccount") + .withArgs(OWNER); }); it("should renounce role if all conditions are met", async () => { @@ -138,26 +138,26 @@ describe("DiamondAccessControl", () => { }); it("should not grant role if not admin", async () => { - await expect(access.grantRole(AGENT_ROLE, THIRD)).to.be.revertedWith( - await hasRoleErrorMessage(OWNER, AGENT_ROLE), - ); - }); + await expect(access.grantRole(AGENT_ROLE, THIRD)) + .to.be.revertedWithCustomError(access, "RoleNotGranted") + .withArgs(await access.getRoleAdmin(AGENT_ROLE), OWNER); - it("should grant role if all conditions are met", async () => { - await access.connect(SECOND).grantRole(AGENT_ROLE, THIRD); + it("should grant role if all conditions are met", async () => { + await access.connect(SECOND).grantRole(AGENT_ROLE, THIRD); - expect(await access.hasRole(AGENT_ROLE, THIRD)).to.be.true; + expect(await access.hasRole(AGENT_ROLE, THIRD)).to.be.true; + }); }); }); - }); - describe("getters", () => { - it("should return base data", async () => { - expect(await access.DEFAULT_ADMIN_ROLE()).to.equal(ADMIN_ROLE); - expect(await access.AGENT_ROLE()).to.equal(AGENT_ROLE); - expect(await access.hasRole(ADMIN_ROLE, OWNER)).to.be.true; - expect(await access.hasRole(ADMIN_ROLE, SECOND)).to.be.false; - expect(await access.getRoleAdmin(AGENT_ROLE)).to.equal(ADMIN_ROLE); + describe("getters", () => { + it("should return base data", async () => { + expect(await access.DEFAULT_ADMIN_ROLE()).to.equal(ADMIN_ROLE); + expect(await access.AGENT_ROLE()).to.equal(AGENT_ROLE); + expect(await access.hasRole(ADMIN_ROLE, OWNER)).to.be.true; + expect(await access.hasRole(ADMIN_ROLE, SECOND)).to.be.false; + expect(await access.getRoleAdmin(AGENT_ROLE)).to.equal(ADMIN_ROLE); + }); }); }); }); diff --git a/test/diamond/DiamondERC165.test.ts b/test/diamond/DiamondERC165.test.ts index daeacbdc..297ed48d 100644 --- a/test/diamond/DiamondERC165.test.ts +++ b/test/diamond/DiamondERC165.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { getSelectors, FacetAction } from "@/test/helpers/diamond-helper"; diff --git a/test/diamond/DiamondERC20.test.ts b/test/diamond/DiamondERC20.test.ts index 1e9461b7..c9033319 100644 --- a/test/diamond/DiamondERC20.test.ts +++ b/test/diamond/DiamondERC20.test.ts @@ -1,9 +1,11 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { getSelectors, FacetAction } from "@/test/helpers/diamond-helper"; -import { ZERO_ADDR, MAX_UINT256 } from "@/scripts/utils/constants"; +import { MAX_UINT256 } from "@/scripts/utils/constants"; import { wei } from "@/scripts/utils/utils"; import { OwnableDiamondMock, DiamondERC20Mock, Diamond } from "@ethers-v6"; @@ -48,15 +50,15 @@ describe("DiamondERC20 and InitializableStorage", () => { describe("access", () => { it("should initialize only once", async () => { - await expect(erc20.__DiamondERC20Mock_init("Mock Token", "MT")).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(erc20.__DiamondERC20Mock_init("Mock Token", "MT")) + .to.be.revertedWithCustomError(erc20, "AlreadyInitialized") + .withArgs(); }); it("should initialize only by top level contract", async () => { - await expect(erc20.__DiamondERC20Direct_init("Mock Token", "MT")).to.be.revertedWith( - "Initializable: contract is not initializing", - ); + await expect(erc20.__DiamondERC20Direct_init("Mock Token", "MT")) + .to.be.revertedWithCustomError(erc20, "NotInitializing") + .withArgs(); }); it("should disable implementation initialization", async () => { @@ -69,7 +71,9 @@ describe("DiamondERC20 and InitializableStorage", () => { .to.emit(contract, "Initialized") .withArgs(await erc20.DIAMOND_ERC20_STORAGE_SLOT()); - await expect(contract.disableInitializers()).to.be.revertedWith("Initializable: contract is initializing"); + await expect(contract.disableInitializers()) + .to.be.revertedWithCustomError(erc20, "InvalidInitialization") + .withArgs(); }); }); @@ -83,18 +87,19 @@ describe("DiamondERC20 and InitializableStorage", () => { }); it("should not transfer tokens to/from zero address", async () => { - await expect(erc20.transferMock(SECOND.address, ZERO_ADDR, wei("100"))).to.be.revertedWith( - "ERC20: transfer to the zero address", - ); - await expect(erc20.transferMock(ZERO_ADDR, SECOND.address, wei("100"))).to.be.revertedWith( - "ERC20: transfer from the zero address", - ); + await expect(erc20.transferMock(SECOND.address, ethers.ZeroAddress, wei("100"))) + .to.be.revertedWithCustomError(erc20, "ReceiverIsZeroAddress") + .withArgs(); + + await expect(erc20.transferMock(ethers.ZeroAddress, SECOND.address, wei("100"))) + .to.be.revertedWithCustomError(erc20, "SenderIsZeroAddress") + .withArgs(); }); it("should not transfer tokens if balance is insufficient", async () => { - await expect(erc20.transfer(SECOND.address, wei("100"))).to.be.revertedWith( - "ERC20: transfer amount exceeds balance", - ); + await expect(erc20.transfer(SECOND.address, wei("100"))) + .to.be.revertedWithCustomError(erc20, "InsufficientBalance") + .withArgs(OWNER.address, erc20.balanceOf(OWNER.address), wei("100")); }); it("should mint tokens", async () => { @@ -104,7 +109,9 @@ describe("DiamondERC20 and InitializableStorage", () => { }); it("should not mint tokens to zero address", async () => { - await expect(erc20.mint(ZERO_ADDR, wei("100"))).to.be.revertedWith("ERC20: mint to the zero address"); + await expect(erc20.mint(ethers.ZeroAddress, wei("100"))) + .to.be.revertedWithCustomError(erc20, "ReceiverIsZeroAddress") + .withArgs(); }); it("should burn tokens", async () => { @@ -115,11 +122,15 @@ describe("DiamondERC20 and InitializableStorage", () => { }); it("should not burn tokens from zero address", async () => { - await expect(erc20.burn(ZERO_ADDR, wei("100"))).to.be.revertedWith("ERC20: burn from the zero address"); + await expect(erc20.burn(ethers.ZeroAddress, wei("100"))) + .to.be.revertedWithCustomError(erc20, "SenderIsZeroAddress") + .withArgs(); }); it("should not burn tokens if balance is insufficient", async () => { - await expect(erc20.burn(OWNER.address, wei("100"))).to.be.revertedWith("ERC20: burn amount exceeds balance"); + await expect(erc20.burn(OWNER.address, wei("100"))) + .to.be.revertedWithCustomError(erc20, "InsufficientBalance") + .withArgs(OWNER.address, erc20.balanceOf(OWNER.address), wei("100")); }); it("should approve tokens", async () => { @@ -129,12 +140,13 @@ describe("DiamondERC20 and InitializableStorage", () => { }); it("should not approve tokens to/from zero address", async () => { - await expect(erc20.approveMock(OWNER.address, ZERO_ADDR, wei("100"))).to.be.revertedWith( - "ERC20: approve to the zero address", - ); - await expect(erc20.approveMock(ZERO_ADDR, OWNER.address, wei("100"))).to.be.revertedWith( - "ERC20: approve from the zero address", - ); + await expect(erc20.approveMock(OWNER.address, ethers.ZeroAddress, wei("100"))) + .to.be.revertedWithCustomError(erc20, "SpenderIsZeroAddress") + .withArgs(); + + await expect(erc20.approveMock(ethers.ZeroAddress, OWNER.address, wei("100"))) + .to.be.revertedWithCustomError(erc20, "ApproverIsZeroAddress") + .withArgs(); }); it("should transfer tokens from address", async () => { @@ -150,9 +162,9 @@ describe("DiamondERC20 and InitializableStorage", () => { await erc20.mint(OWNER.address, wei("100")); await erc20.approve(SECOND.address, wei("100")); - await expect(erc20.connect(SECOND).transferFrom(OWNER.address, SECOND.address, wei("110"))).to.be.revertedWith( - "ERC20: insufficient allowance", - ); + await expect(erc20.connect(SECOND).transferFrom(OWNER.address, SECOND.address, wei("110"))) + .to.be.revertedWithCustomError(erc20, "InsufficientAllowance") + .withArgs(SECOND.address, await erc20.allowance(OWNER.address, SECOND.address), wei("110")); }); it("should not spend allowance if allowance is infinite type(uint256).max", async () => { diff --git a/test/diamond/DiamondERC721.test.ts b/test/diamond/DiamondERC721.test.ts index d2438707..f492e126 100644 --- a/test/diamond/DiamondERC721.test.ts +++ b/test/diamond/DiamondERC721.test.ts @@ -1,11 +1,12 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { getSelectors, FacetAction } from "@/test/helpers/diamond-helper"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; -import { OwnableDiamondMock, DiamondERC721Mock, Diamond } from "@ethers-v6"; +import { OwnableDiamondMock, DiamondERC721Mock, Diamond, DiamondERC721NotReceiverMock } from "@ethers-v6"; describe("DiamondERC721 and InitializableStorage", () => { const reverter = new Reverter(); @@ -16,15 +17,19 @@ describe("DiamondERC721 and InitializableStorage", () => { let erc721: DiamondERC721Mock; let diamond: OwnableDiamondMock; + let notReceiverMock: DiamondERC721NotReceiverMock; before("setup", async () => { [OWNER, SECOND, THIRD] = await ethers.getSigners(); const OwnableDiamond = await ethers.getContractFactory("OwnableDiamondMock"); const DiamondERC721Mock = await ethers.getContractFactory("DiamondERC721Mock"); + const DiamondERC721NotReceiverMock = await ethers.getContractFactory("DiamondERC721NotReceiverMock"); diamond = await OwnableDiamond.deploy(); + const diamond2 = await OwnableDiamond.deploy(); erc721 = await DiamondERC721Mock.deploy(); + notReceiverMock = await DiamondERC721NotReceiverMock.deploy(); const facets: Diamond.FacetStruct[] = [ { @@ -34,12 +39,25 @@ describe("DiamondERC721 and InitializableStorage", () => { }, ]; + const facets2: Diamond.FacetStruct[] = [ + { + facetAddress: await notReceiverMock.getAddress(), + action: FacetAction.Add, + functionSelectors: getSelectors(notReceiverMock.interface), + }, + ]; + await diamond.__OwnableDiamondMock_init(); await diamond.diamondCutShort(facets); + await diamond2.__OwnableDiamondMock_init(); + await diamond2.diamondCutShort(facets2); + erc721 = DiamondERC721Mock.attach(await diamond.getAddress()); + notReceiverMock = DiamondERC721NotReceiverMock.attach(await diamond2.getAddress()); await erc721.__DiamondERC721Mock_init("Mock Token", "MT"); + await notReceiverMock.__DiamondERC721Mock_init("Mock Token", "MT"); await reverter.snapshot(); }); @@ -48,15 +66,15 @@ describe("DiamondERC721 and InitializableStorage", () => { describe("access", () => { it("should initialize only once", async () => { - await expect(erc721.__DiamondERC721Mock_init("Mock Token", "MT")).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(erc721.__DiamondERC721Mock_init("Mock Token", "MT")) + .to.be.revertedWithCustomError(erc721, "AlreadyInitialized") + .withArgs(); }); it("should initialize only by top level contract", async () => { - await expect(erc721.__DiamondERC721Direct_init("Mock Token", "MT")).to.be.revertedWith( - "Initializable: contract is not initializing", - ); + await expect(erc721.__DiamondERC721Direct_init("Mock Token", "MT")) + .to.be.revertedWithCustomError(erc721, "NotInitializing") + .withArgs(); }); it("should disable implementation initialization", async () => { @@ -69,7 +87,7 @@ describe("DiamondERC721 and InitializableStorage", () => { .to.emit(contract, "Initialized") .withArgs(await erc721.DIAMOND_ERC721_STORAGE_SLOT()); - await expect(contract.disableInitializers()).to.be.revertedWith("Initializable: contract is initializing"); + await expect(contract.disableInitializers()).to.be.revertedWithCustomError(erc721, "InvalidInitialization"); }); }); @@ -87,16 +105,17 @@ describe("DiamondERC721 and InitializableStorage", () => { expect(await erc721.tokenByIndex(0)).to.equal(1); expect(await erc721.ownerOf(1)).to.equal(OWNER.address); - await expect(erc721.tokenOfOwnerByIndex(OWNER.address, 10)).to.be.revertedWith( - "ERC721Enumerable: owner index out of bounds", - ); - await expect(erc721.tokenByIndex(10)).to.be.revertedWith("ERC721Enumerable: global index out of bounds"); + await expect(erc721.tokenOfOwnerByIndex(OWNER.address, 10)) + .to.be.revertedWithCustomError(erc721, "OwnerIndexOutOfBounds") + .withArgs(OWNER.address, 10); + + await expect(erc721.tokenByIndex(10)).to.be.revertedWithCustomError(erc721, "IndexOutOfBounds").withArgs(10); expect(await erc721.tokenURI(1)).to.equal(""); await erc721.setBaseURI("https://example.com/"); expect(await erc721.tokenURI(1)).to.equal("https://example.com/1"); - await expect(erc721.tokenURI(10)).to.be.revertedWith("ERC721: invalid token ID"); + await expect(erc721.tokenURI(10)).to.be.revertedWithCustomError(erc721, "NonexistentToken").withArgs(10); }); it("should support all necessary interfaces", async () => { @@ -116,37 +135,46 @@ describe("DiamondERC721 and InitializableStorage", () => { it("should mint tokens", async () => { const tx = erc721.mint(OWNER.address, 1); - await expect(tx).to.emit(erc721, "Transfer").withArgs(ZERO_ADDR, OWNER.address, 1); + await expect(tx).to.emit(erc721, "Transfer").withArgs(ethers.ZeroAddress, OWNER.address, 1); expect(await erc721.balanceOf(OWNER.address)).to.equal(1); }); it("should not mint tokens to zero address", async () => { - await expect(erc721.mint(ZERO_ADDR, 1)).to.be.revertedWith("ERC721: mint to the zero address"); + await expect(erc721.mint(ethers.ZeroAddress, 1)).to.be.revertedWithCustomError(erc721, "ReceiverIsZeroAddress"); }); it("should not mint tokens if it's alredy minted", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.mint(OWNER.address, 1)).to.be.revertedWith("ERC721: token already minted"); + await expect(erc721.mint(OWNER.address, 1)) + .to.be.revertedWithCustomError(erc721, "TokenAlreadyMinted") + .withArgs(1); }); - it("should not mint tokens if token is minted after `_beforeTokenTransfer` hook", async () => { + it("should not mint tokens if token is minted after `_update` hook", async () => { await erc721.toggleReplaceOwner(); - await expect(erc721.mint(OWNER.address, 1)).to.be.revertedWith("ERC721: token already minted"); + await expect(erc721.mint(OWNER.address, 1)) + .to.be.revertedWithCustomError(erc721, "TokenAlreadyMinted") + .withArgs(1); }); it("should not mint token if the receiver is a contract and doesn't implement onERC721Received correctly", async () => { const contract1 = await (await ethers.getContractFactory("DiamondERC721Mock")).deploy(); - await expect(erc721.mint(await contract1.getAddress(), 1)).to.be.revertedWith( - "ERC721: transfer to non ERC721Receiver implementer", - ); + await expect(erc721.mint(await contract1.getAddress(), 1)) + .to.be.revertedWithCustomError(erc721, "NonERC721Receiver") + .withArgs(await contract1.getAddress()); + + await expect(notReceiverMock.mint(await contract1.getAddress(), 1)) + .to.be.revertedWithCustomError(notReceiverMock, "NonERC721Receiver") + .withArgs(await contract1.getAddress()); const contract2 = await (await ethers.getContractFactory("NonERC721Receiver")).deploy(); - await expect(erc721.mint(await contract2.getAddress(), 1)).to.be.revertedWith( - "ERC721Receiver: reverting onERC721Received", + await expect(erc721.mint(await contract2.getAddress(), 1)).to.be.revertedWithCustomError( + contract2, + "RevertingOnERC721Received", ); }); }); @@ -159,25 +187,23 @@ describe("DiamondERC721 and InitializableStorage", () => { const tx = erc721.burn(1); - await expect(tx).to.emit(erc721, "Transfer").withArgs(OWNER.address, ZERO_ADDR, 1); + await expect(tx).to.emit(erc721, "Transfer").withArgs(OWNER.address, ethers.ZeroAddress, 1); expect(await erc721.balanceOf(OWNER.address)).to.equal(0); }); - it("should not burn an incorrect token", async () => { - await expect(erc721.burn(1)).to.be.revertedWith("ERC721: invalid token ID"); + it("should not burn a not minted token", async () => { + await expect(erc721.burn(1)).to.be.revertedWithCustomError(erc721, "NonexistentToken").withArgs(1); }); }); - describe("before token transfer hook", () => { - it("before token transfer hook should only accept one token", async () => { - expect(await erc721.beforeTokenTransfer(1)).not.to.be.reverted; + describe("update hook", () => { + it("update hook should only accept one token", async () => { + expect(await erc721.update(1)).not.to.be.reverted; }); - it("before token transfer hook should not accept more than one token", async () => { - await expect(erc721.beforeTokenTransfer(2)).to.be.revertedWith( - "ERC721Enumerable: consecutive transfers not supported", - ); + it("update hook should not accept more than one token", async () => { + await expect(erc721.update(2)).to.be.revertedWithCustomError(erc721, "ConsecutiveTransfersNotSupported"); }); }); @@ -217,7 +243,7 @@ describe("DiamondERC721 and InitializableStorage", () => { expect(await erc721.balanceOf(OWNER.address)).to.equal(1); expect(await erc721.balanceOf(SECOND.address)).to.equal(0); - const receiver = await (await ethers.getContractFactory("ERC721Holder")).deploy(); + const receiver = await (await ethers.getContractFactory("ERC721HolderMock")).deploy(); const tx = erc721.safeTransferFromMock(OWNER.address, await receiver.getAddress(), 1); await expect(tx) @@ -231,48 +257,57 @@ describe("DiamondERC721 and InitializableStorage", () => { it("should not transfer tokens when caller is not an owner or not approved", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.connect(SECOND).transferFrom(OWNER.address, SECOND.address, 1)).to.be.revertedWith( - "ERC721: caller is not token owner or approved", - ); - await expect(erc721.connect(SECOND).safeTransferFromMock(OWNER.address, SECOND.address, 1)).to.be.revertedWith( - "ERC721: caller is not token owner or approved", - ); + await expect(erc721.connect(SECOND).transferFrom(OWNER.address, SECOND.address, 1)) + .to.be.revertedWithCustomError(erc721, "InvalidSpender") + .withArgs(SECOND.address, 1); + + await expect(erc721.connect(SECOND).safeTransferFromMock(OWNER.address, SECOND.address, 1)) + .to.be.revertedWithCustomError(erc721, "InvalidSpender") + .withArgs(SECOND.address, 1); }); it("should not transfer tokens when call is not an owner", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.transferFromMock(SECOND.address, OWNER.address, 1)).to.be.revertedWith( - "ERC721: transfer from incorrect owner", - ); + await expect(erc721.transferFromMock(SECOND.address, OWNER.address, 1)) + .to.be.revertedWithCustomError(erc721, "UnauthorizedAccount") + .withArgs(SECOND.address); }); it("should not transfer tokens to zero address", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.transferFromMock(OWNER.address, ZERO_ADDR, 1)).to.be.revertedWith( - "ERC721: transfer to the zero address", + await expect(erc721.transferFromMock(OWNER.address, ethers.ZeroAddress, 1)).to.be.revertedWithCustomError( + erc721, + "ReceiverIsZeroAddress", ); }); - it("should not transfer tokens if owner is changed after `_beforeTokenTransfer` hook", async () => { + it("should not transfer tokens if owner is changed after `_update` hook", async () => { await erc721.mint(OWNER.address, 1); await erc721.toggleReplaceOwner(); - await expect(erc721.transferFromMock(OWNER.address, SECOND.address, 1)).to.be.revertedWith( - "ERC721: transfer from incorrect owner", + await expect(erc721.transferFromMock(OWNER.address, SECOND.address, 1)).to.be.revertedWithCustomError( + erc721, + "UnauthorizedAccount", ); }); it("should not transfer token if the receiver is a contract and doesn't implement onERC721Received", async () => { - await erc721.mint(OWNER.address, 1); + await notReceiverMock.mockMint(OWNER.address, 1); const contract = await (await ethers.getContractFactory("DiamondERC721Mock")).deploy(); - await expect(erc721.safeTransferFromMock(OWNER.address, await contract.getAddress(), 1)).to.be.revertedWith( - "ERC721: transfer to non ERC721Receiver implementer", - ); + await expect(notReceiverMock.safeTransferFromMock(OWNER.address, await contract.getAddress(), 1)) + .to.be.revertedWithCustomError(notReceiverMock, "NonERC721Receiver") + .withArgs(await contract.getAddress()); + }); + + it("should not transfer incorrect token", async () => { + await expect(erc721.transferFromMock(OWNER.address, SECOND.address, 1)) + .to.be.revertedWithCustomError(erc721, "NonexistentToken") + .withArgs(1); }); }); @@ -298,20 +333,24 @@ describe("DiamondERC721 and InitializableStorage", () => { }); it("should not approve incorrect token", async () => { - await expect(erc721.approve(OWNER.address, 1)).to.be.revertedWith("ERC721: invalid token ID"); + await expect(erc721.approve(OWNER.address, 1)) + .to.be.revertedWithCustomError(erc721, "NonexistentToken") + .withArgs(1); }); it("should not approve token if caller is not an owner", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.connect(SECOND).approve(THIRD.address, 1)).to.be.revertedWith( - "ERC721: approve caller is not token owner or approved for all", - ); + await expect(erc721.connect(SECOND).approve(THIRD.address, 1)) + .to.be.revertedWithCustomError(erc721, "InvalidApprover") + .withArgs(SECOND.address, OWNER.address); }); it("should not approve token if spender and caller are the same", async () => { await erc721.mint(OWNER.address, 1); - await expect(erc721.approve(OWNER.address, 1)).to.be.revertedWith("ERC721: approval to current owner"); + await expect(erc721.approve(OWNER.address, 1)) + .to.be.revertedWithCustomError(erc721, "ApprovalToCurrentOwner") + .withArgs(OWNER.address, 1); }); it("should approve all tokens", async () => { @@ -332,7 +371,9 @@ describe("DiamondERC721 and InitializableStorage", () => { await erc721.mint(OWNER.address, 2); await erc721.mint(OWNER.address, 3); - await expect(erc721.setApprovalForAll(OWNER.address, true)).to.be.revertedWith("ERC721: approve to caller"); + await expect(erc721.setApprovalForAll(OWNER.address, true)) + .to.be.revertedWithCustomError(erc721, "ApproveToCaller") + .withArgs(OWNER.address); }); }); }); diff --git a/test/finance/compound-rate-keeper/CompoundRateKeeper.test.ts b/test/finance/compound-rate-keeper/CompoundRateKeeper.test.ts index b0f56212..347441af 100644 --- a/test/finance/compound-rate-keeper/CompoundRateKeeper.test.ts +++ b/test/finance/compound-rate-keeper/CompoundRateKeeper.test.ts @@ -1,7 +1,9 @@ import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { precision } from "@/scripts/utils/utils"; @@ -31,22 +33,20 @@ describe("CompoundRateKeeper", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(keeper.mockInit(precision(1), 31536000)).to.be.revertedWith( - "Initializable: contract is not initializing", - ); - await expect(keeper.__OwnableCompoundRateKeeper_init(precision(1), 31536000)).to.be.revertedWith( - "Initializable: contract is already initialized", - ); + await expect(keeper.mockInit(precision(1), 31536000)).to.be.revertedWithCustomError(keeper, "NotInitializing"); + await expect(keeper.__OwnableCompoundRateKeeper_init(precision(1), 31536000)) + .to.be.revertedWithCustomError(keeper, "InvalidInitialization") + .withArgs(); }); it("only owner should call these functions", async () => { - await expect(keeper.connect(SECOND).setCapitalizationRate(precision(1))).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(keeper.connect(SECOND).setCapitalizationRate(precision(1))) + .to.be.revertedWithCustomError(keeper, "OwnableUnauthorizedAccount") + .withArgs(SECOND); - await expect(keeper.connect(SECOND).setCapitalizationPeriod(31536000)).to.be.revertedWith( - "Ownable: caller is not the owner", - ); + await expect(keeper.connect(SECOND).setCapitalizationPeriod(31536000)) + .to.be.revertedWithCustomError(keeper, "OwnableUnauthorizedAccount") + .withArgs(SECOND); }); }); @@ -73,7 +73,9 @@ describe("CompoundRateKeeper", () => { }); it("should revert if rate is less than zero", async () => { - await expect(keeper.setCapitalizationRate(precision(0.99999))).to.be.revertedWith("CRK: rate is less than 1"); + await expect(keeper.setCapitalizationRate(precision(0.99999))) + .to.be.revertedWithCustomError(keeper, "RateIsLessThanOne") + .withArgs(precision(0.99999)); }); it("should revert if compound rate reaches max limit", async () => { @@ -83,7 +85,9 @@ describe("CompoundRateKeeper", () => { await time.setNextBlockTimestamp((await time.latest()) + 100 * 31536000); await keeper.emergencyUpdateCompoundRate(); - await expect(keeper.setCapitalizationRate(precision(1.1))).to.be.revertedWith("CRK: max rate is reached"); + await expect(keeper.setCapitalizationRate(precision(1.1))) + .to.be.revertedWithCustomError(keeper, "MaxRateIsReached") + .withArgs(); }); }); @@ -99,7 +103,9 @@ describe("CompoundRateKeeper", () => { }); it("should revert if capitalization period is zero", async () => { - await expect(keeper.setCapitalizationPeriod(0)).to.be.revertedWith("CRK: invalid period"); + await expect(keeper.setCapitalizationPeriod(0)) + .to.be.revertedWithCustomError(keeper, "CapitalizationPeriodIsZero") + .withArgs(); }); it("should revert if compound rate reaches max limit", async () => { @@ -109,7 +115,9 @@ describe("CompoundRateKeeper", () => { await time.setNextBlockTimestamp((await time.latest()) + 100 * 31536000); await keeper.emergencyUpdateCompoundRate(); - await expect(keeper.setCapitalizationPeriod(1)).to.be.revertedWith("CRK: max rate is reached"); + await expect(keeper.setCapitalizationPeriod(1)) + .to.be.revertedWithCustomError(keeper, "MaxRateIsReached") + .withArgs(); }); }); diff --git a/test/finance/staking/AbstractStaking.test.ts b/test/finance/staking/AbstractStaking.test.ts index adf8f8ea..f72e8f8f 100644 --- a/test/finance/staking/AbstractStaking.test.ts +++ b/test/finance/staking/AbstractStaking.test.ts @@ -1,12 +1,13 @@ import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { AbstractStakingMock, ERC20Mock } from "@ethers-v6"; import { wei } from "@/scripts/utils/utils"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; describe("AbstractStaking", () => { const reverter = new Reverter(); @@ -146,12 +147,13 @@ describe("AbstractStaking", () => { describe("AbstractStaking initialization", () => { it("should not initialize twice", async () => { - await expect(abstractStaking.mockInit(sharesToken, rewardsToken, rate, stakingStartTime)).to.be.revertedWith( - "Initializable: contract is not initializing", - ); - await expect( - abstractStaking.__AbstractStakingMock_init(sharesToken, rewardsToken, rate, stakingStartTime), - ).to.be.revertedWith("Initializable: contract is already initialized"); + await expect(abstractStaking.mockInit(sharesToken, rewardsToken, rate, stakingStartTime)) + .to.be.revertedWithCustomError(abstractStaking, "NotInitializing") + .withArgs(); + + await expect(abstractStaking.__AbstractStakingMock_init(sharesToken, rewardsToken, rate, stakingStartTime)) + .to.be.revertedWithCustomError(abstractStaking, "InvalidInitialization") + .withArgs(); }); it("should set the initial values correctly", async () => { @@ -165,27 +167,36 @@ describe("AbstractStaking", () => { const AbstractStakingMock = await ethers.getContractFactory("AbstractStakingMock"); let abstractStaking = await AbstractStakingMock.deploy(); - await expect( - abstractStaking.__AbstractStakingMock_init(ZERO_ADDR, rewardsToken, rate, stakingStartTime), - ).to.be.revertedWith("Staking: zero address cannot be the Shares Token"); + await expect(abstractStaking.__AbstractStakingMock_init(ethers.ZeroAddress, rewardsToken, rate, stakingStartTime)) + .to.be.revertedWithCustomError(abstractStaking, "SharesTokenIsZeroAddress") + .withArgs(); - await expect( - abstractStaking.__AbstractStakingMock_init(sharesToken, ZERO_ADDR, rate, stakingStartTime), - ).to.be.revertedWith("Staking: zero address cannot be the Rewards Token"); + await expect(abstractStaking.__AbstractStakingMock_init(sharesToken, ethers.ZeroAddress, rate, stakingStartTime)) + .to.be.revertedWithCustomError(abstractStaking, "RewardsTokenIsZeroAddress") + .withArgs(); }); }); describe("timestamps", () => { it("should not allow to stake, unstake, withdraw tokens or claim rewards before the start of the staking", async () => { - await abstractStaking.setStakingStartTime(1638474321); - - const revertMessage = "Staking: staking has not started yet"; - - await expect(abstractStaking.stake(wei(100, sharesDecimals))).to.be.revertedWith(revertMessage); - await expect(abstractStaking.unstake(wei(100, sharesDecimals))).to.be.revertedWith(revertMessage); - await expect(abstractStaking.withdraw()).to.be.revertedWith(revertMessage); - await expect(abstractStaking.claim(wei(100, sharesDecimals))).to.be.revertedWith(revertMessage); - await expect(abstractStaking.claimAll()).to.be.revertedWith(revertMessage); + const stakingStartTime = 1638474321; + await abstractStaking.setStakingStartTime(stakingStartTime); + + await expect(abstractStaking.stake(wei(100, sharesDecimals))) + .to.be.revertedWithCustomError(abstractStaking, "StakingHasNotStarted") + .withArgs((await time.latest()) + 1, stakingStartTime); + await expect(abstractStaking.unstake(wei(100, sharesDecimals))) + .to.be.revertedWithCustomError(abstractStaking, "StakingHasNotStarted") + .withArgs((await time.latest()) + 1, stakingStartTime); + await expect(abstractStaking.withdraw()) + .to.be.revertedWithCustomError(abstractStaking, "StakingHasNotStarted") + .withArgs((await time.latest()) + 1, stakingStartTime); + await expect(abstractStaking.claim(wei(100, sharesDecimals))) + .to.be.revertedWithCustomError(abstractStaking, "StakingHasNotStarted") + .withArgs((await time.latest()) + 1, stakingStartTime); + await expect(abstractStaking.claimAll()) + .to.be.revertedWithCustomError(abstractStaking, "StakingHasNotStarted") + .withArgs((await time.latest()) + 1, stakingStartTime); }); it("should work as expected if the staking start time is set to the timestamp in the past", async () => { @@ -313,9 +324,9 @@ describe("AbstractStaking", () => { }); it("should not allow to stake 0 tokens", async () => { - await expect(abstractStaking.connect(FIRST).stake(0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractStaking.connect(FIRST).stake(0)) + .to.be.revertedWithCustomError(abstractStaking, "AmountIsZero") + .withArgs(); }); }); @@ -382,18 +393,18 @@ describe("AbstractStaking", () => { }); it("should not allow to unstake 0 tokens", async () => { - await expect(abstractStaking.connect(FIRST).unstake(0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractStaking.connect(FIRST).unstake(0)) + .to.be.revertedWithCustomError(abstractStaking, "AmountIsZero") + .withArgs(); }); it("should not allow to unstake more than it was staked", async () => { await mintAndApproveTokens(FIRST, sharesToken, wei(100, sharesDecimals)); await abstractStaking.connect(FIRST).stake(wei(100, sharesDecimals)); - await expect(abstractStaking.connect(FIRST).unstake(wei(150, sharesDecimals))).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractStaking.connect(FIRST).unstake(wei(150, sharesDecimals))) + .to.be.revertedWithCustomError(abstractStaking, "InsufficientSharesAmount") + .withArgs(FIRST.address, wei(100, sharesDecimals), wei(150, sharesDecimals)); }); }); @@ -478,7 +489,9 @@ describe("AbstractStaking", () => { abstractStaking.interface.encodeFunctionData("unstake", [wei(200, sharesDecimals)]), abstractStaking.interface.encodeFunctionData("withdraw"), ]), - ).to.be.revertedWith("ValueDistributor: amount has to be more than 0"); + ) + .to.be.revertedWithCustomError(abstractStaking, "AmountIsZero") + .withArgs(); }); }); @@ -584,17 +597,17 @@ describe("AbstractStaking", () => { }); it("should not allow to claim 0 rewards", async () => { - await expect(abstractStaking.connect(FIRST).claim(0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractStaking.connect(FIRST).claim(0)) + .to.be.revertedWithCustomError(abstractStaking, "AmountIsZero") + .withArgs(); }); it("should not allow to claim more rewards than earned", async () => { await performStakingManipulations(); - await expect(abstractStaking.connect(FIRST).claim(wei(4, rewardsDecimals))).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractStaking.connect(FIRST).claim(wei(4, rewardsDecimals))) + .to.be.revertedWithCustomError(abstractStaking, "InsufficientOwedValue") + .withArgs(FIRST.address, abstractStaking.getOwedValue(FIRST.address), wei(4, rewardsDecimals)); }); }); @@ -649,7 +662,9 @@ describe("AbstractStaking", () => { abstractStaking.interface.encodeFunctionData("claimAll"), abstractStaking.interface.encodeFunctionData("claimAll"), ]), - ).to.be.revertedWith("ValueDistributor: amount has to be more than 0"); + ) + .to.be.revertedWithCustomError(abstractStaking, "AmountIsZero") + .withArgs(); }); }); diff --git a/test/finance/staking/AbstractValueDistributor.test.ts b/test/finance/staking/AbstractValueDistributor.test.ts index a20e8593..9ace0eac 100644 --- a/test/finance/staking/AbstractValueDistributor.test.ts +++ b/test/finance/staking/AbstractValueDistributor.test.ts @@ -1,12 +1,13 @@ import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { wei } from "@/scripts/utils/utils"; import { AbstractValueDistributorMock } from "@ethers-v6"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; describe("AbstractValueDistributor", () => { const reverter = new Reverter(); @@ -84,15 +85,15 @@ describe("AbstractValueDistributor", () => { }); it("should not allow to add 0 shares", async () => { - await expect(abstractValueDistributor.addShares(SECOND, 0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractValueDistributor.addShares(SECOND, 0)) + .to.be.revertedWithCustomError(abstractValueDistributor, "AmountIsZero") + .withArgs(); }); it("should not allow zero address to add shares", async () => { - await expect(abstractValueDistributor.addShares(ZERO_ADDR, 2)).to.be.revertedWith( - "ValueDistributor: zero address is not allowed", - ); + await expect(abstractValueDistributor.addShares(ethers.ZeroAddress, 2)) + .to.be.revertedWithCustomError(abstractValueDistributor, "UserIsZeroAddress") + .withArgs(); }); }); @@ -126,21 +127,21 @@ describe("AbstractValueDistributor", () => { }); it("should not allow to remove 0 shares", async () => { - await expect(abstractValueDistributor.removeShares(SECOND, 0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractValueDistributor.removeShares(SECOND, 0)) + .to.be.revertedWithCustomError(abstractValueDistributor, "AmountIsZero") + .withArgs(); }); it("should not allow zero address to remove shares", async () => { - await expect(abstractValueDistributor.removeShares(ZERO_ADDR, 2)).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractValueDistributor.removeShares(ethers.ZeroAddress, 2)) + .to.be.revertedWithCustomError(abstractValueDistributor, "InsufficientSharesAmount") + .withArgs(ethers.ZeroAddress, 0, 2); }); it("should not allow to remove more shares than it was added", async () => { - await expect(abstractValueDistributor.removeShares(SECOND, 1)).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractValueDistributor.removeShares(SECOND, 1)) + .to.be.revertedWithCustomError(abstractValueDistributor, "InsufficientSharesAmount") + .withArgs(SECOND, (await abstractValueDistributor.userDistribution(SECOND)).shares, 1); }); }); @@ -303,23 +304,23 @@ describe("AbstractValueDistributor", () => { }); it("should not allow to distribute 0 values", async () => { - await expect(abstractValueDistributor.distributeValue(FIRST, 0)).to.be.revertedWith( - "ValueDistributor: amount has to be more than 0", - ); + await expect(abstractValueDistributor.distributeValue(FIRST, 0)) + .to.be.revertedWithCustomError(abstractValueDistributor, "AmountIsZero") + .withArgs(); }); it("should not allow zero address to distribute values", async () => { - await expect(abstractValueDistributor.distributeValue(ZERO_ADDR, 2)).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractValueDistributor.distributeValue(ethers.ZeroAddress, 2)) + .to.be.revertedWithCustomError(abstractValueDistributor, "InsufficientOwedValue") + .withArgs(ethers.ZeroAddress, 0, 2); }); it("should not allow to distribute more values than owed", async () => { await performSharesManipulations(); - await expect(abstractValueDistributor.distributeValue(FIRST, wei(4))).to.be.revertedWith( - "ValueDistributor: insufficient amount", - ); + await expect(abstractValueDistributor.distributeValue(FIRST, wei(4))) + .to.be.revertedWithCustomError(abstractValueDistributor, "InsufficientOwedValue") + .withArgs(FIRST, abstractValueDistributor.getOwedValue(FIRST), wei(4)); }); }); diff --git a/test/finance/vesting/Vesting.test.ts b/test/finance/vesting/Vesting.test.ts index a8518853..87b9b81b 100644 --- a/test/finance/vesting/Vesting.test.ts +++ b/test/finance/vesting/Vesting.test.ts @@ -1,18 +1,20 @@ -import { MAX_UINT256, ZERO_ADDR } from "@/scripts/utils/constants"; -import { precision, wei } from "@/scripts/utils/utils"; -import { Reverter } from "@/test/helpers/reverter"; +import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import { ethers } from "hardhat"; + +import { Reverter } from "@/test/helpers/reverter"; +import { precision, wei } from "@/scripts/utils/utils"; +import { MAX_UINT256 } from "@/scripts/utils/constants"; import { ERC20Mock, ERC20Mock__factory, Vesting, VestingMock, VestingMock__factory } from "@ethers-v6"; describe("Vesting", () => { let reverter = new Reverter(); - let owner: SignerWithAddress; - let alice: SignerWithAddress; + let OWNER: SignerWithAddress; + let ALICE: SignerWithAddress; let vesting: VestingMock; let erc20: ERC20Mock; @@ -30,14 +32,14 @@ describe("Vesting", () => { const exponent = 4n; before(async () => { - [owner, alice] = await ethers.getSigners(); + [OWNER, ALICE] = await ethers.getSigners(); - vesting = await new VestingMock__factory(owner).deploy(); - erc20 = await new ERC20Mock__factory(owner).deploy("Test", "TST", 18); + vesting = await new VestingMock__factory(OWNER).deploy(); + erc20 = await new ERC20Mock__factory(OWNER).deploy("Test", "TST", 18); await vesting.__VestingMock_init(); - await erc20.mint(owner.address, wei(1_000_000)); + await erc20.mint(OWNER.address, wei(1_000_000)); await erc20.approve(await vesting.getAddress(), MAX_UINT256); await reverter.snapshot(); @@ -55,8 +57,10 @@ describe("Vesting", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(vesting.__VestingMock_init()).to.be.revertedWith("Initializable: contract is already initialized"); - await expect(vesting.vestingInit()).to.be.revertedWith("Initializable: contract is not initializing"); + await expect(vesting.__VestingMock_init()) + .to.be.revertedWithCustomError(vesting, "InvalidInitialization") + .withArgs(); + await expect(vesting.vestingInit()).to.be.revertedWithCustomError(vesting, "NotInitializing").withArgs(); }); }); @@ -87,34 +91,35 @@ describe("Vesting", () => { it("should revert if duration periods is 0", async () => { let baseSchedule = { secondsInPeriod, durationInPeriods: 0, cliffInPeriods } as BaseSchedule; - await expect(vesting.createBaseSchedule(baseSchedule)).to.be.revertedWith( - "VestingWallet: cannot create schedule with zero duration or zero seconds in period", - ); + await expect(vesting.createBaseSchedule(baseSchedule)) + .to.be.revertedWithCustomError(vesting, "ScheduleInvalidPeriodParameter") + .withArgs(0, secondsInPeriod); }); it("should revert if seconds in period is 0", async () => { let baseSchedule = { secondsInPeriod: 0, durationInPeriods, cliffInPeriods } as BaseSchedule; - await expect(vesting.createBaseSchedule(baseSchedule)).to.be.revertedWith( - "VestingWallet: cannot create schedule with zero duration or zero seconds in period", - ); + await expect(vesting.createBaseSchedule(baseSchedule)) + .to.be.revertedWithCustomError(vesting, "ScheduleInvalidPeriodParameter") + .withArgs(durationInPeriods, 0); }); it("should revert if cliff is greater than duration", async () => { - let baseSchedule = { secondsInPeriod, durationInPeriods, cliffInPeriods: durationInPeriods + 1n } as BaseSchedule; + const wrongCliff = durationInPeriods + 1n; + let baseSchedule = { secondsInPeriod, durationInPeriods, cliffInPeriods: wrongCliff } as BaseSchedule; - await expect(vesting.createBaseSchedule(baseSchedule)).to.be.revertedWith( - "VestingWallet: cliff cannot be greater than duration", - ); + await expect(vesting.createBaseSchedule(baseSchedule)) + .to.be.revertedWithCustomError(vesting, "ScheduleCliffGreaterThanDuration") + .withArgs(wrongCliff, durationInPeriods); }); it("should revert if exponent is 0", async () => { let baseSchedule = { secondsInPeriod, durationInPeriods, cliffInPeriods } as BaseSchedule; let schedule = { scheduleData: baseSchedule, exponent: 0 } as Schedule; - await expect(vesting.createSchedule(schedule)).to.be.revertedWith( - "VestingWallet: cannot create schedule with zero exponent", - ); + await expect(vesting.createSchedule(schedule)) + .to.be.revertedWithCustomError(vesting, "ExponentIsZero") + .withArgs(); }); }); @@ -138,7 +143,7 @@ describe("Vesting", () => { defaultVesting = { vestingStartTime: await time.latest(), - beneficiary: alice.address, + beneficiary: ALICE.address, vestingToken: await erc20.getAddress(), vestingAmount: vestingAmount, paidAmount: 0, @@ -149,7 +154,7 @@ describe("Vesting", () => { it("should correctly create vesting", async () => { let linearVesting = { vestingStartTime: await time.latest(), - beneficiary: alice.address, + beneficiary: ALICE.address, vestingToken: await erc20.getAddress(), vestingAmount: vestingAmount, paidAmount: 0, @@ -174,8 +179,8 @@ describe("Vesting", () => { expect(await vesting.getVesting(1)).to.deep.equal(Object.values(linearVesting)); expect(await vesting.getVesting(2)).to.deep.equal(Object.values(exponentialVesting)); - expect(await vesting.getVestingIds(await alice.getAddress())).to.deep.equal([1, 2]); - expect(await vesting.getVestings(await alice.getAddress())).to.deep.equal([ + expect(await vesting.getVestingIds(await ALICE.getAddress())).to.deep.equal([1, 2]); + expect(await vesting.getVestings(await ALICE.getAddress())).to.deep.equal([ Object.values(linearVesting), Object.values(exponentialVesting), ]); @@ -190,41 +195,41 @@ describe("Vesting", () => { it("should revert if vesting start time is zero", async () => { defaultVesting.vestingStartTime = 0; - await expect(vesting.createVesting(defaultVesting)).to.be.revertedWith( - "VestingWallet: cannot create vesting for zero time", - ); + await expect(vesting.createVesting(defaultVesting)) + .to.be.revertedWithCustomError(vesting, "StartTimeIsZero") + .withArgs(); }); it("should revert if vesting amount is zero", async () => { defaultVesting.vestingAmount = 0; - await expect(vesting.createVesting(defaultVesting)).to.be.revertedWith( - "VestingWallet: cannot create vesting for zero amount", - ); + await expect(vesting.createVesting(defaultVesting)) + .to.be.revertedWithCustomError(vesting, "VestingAmountIsZero") + .withArgs(); }); it("should revert if vesting beneficiary is zero address", async () => { - defaultVesting.beneficiary = ZERO_ADDR; + defaultVesting.beneficiary = ethers.ZeroAddress; - await expect(vesting.createVesting(defaultVesting)).to.be.revertedWith( - "VestingWallet: cannot create vesting for zero address", - ); + await expect(vesting.createVesting(defaultVesting)) + .to.be.revertedWithCustomError(vesting, "BeneficiaryIsZeroAddress") + .withArgs(); }); it("should revert if vesting token is zero address", async () => { - defaultVesting.vestingToken = ZERO_ADDR; + defaultVesting.vestingToken = ethers.ZeroAddress; - await expect(vesting.createVesting(defaultVesting)).to.be.revertedWith( - "VestingWallet: vesting token cannot be zero address", - ); + await expect(vesting.createVesting(defaultVesting)) + .to.be.revertedWithCustomError(vesting, "VestingTokenIsZeroAddress") + .withArgs(); }); it("should revert if vesting created for a past date", async () => { await time.increase(secondsInPeriod * durationInPeriods); - await expect(vesting.createVesting(defaultVesting)).to.be.revertedWith( - "VestingWallet: cannot create vesting for a past date", - ); + await expect(vesting.createVesting(defaultVesting)) + .to.be.revertedWithCustomError(vesting, "VestingPastDate") + .withArgs(); }); }); @@ -244,7 +249,7 @@ describe("Vesting", () => { linearVesting = { vestingStartTime: await time.latest(), - beneficiary: alice.address, + beneficiary: ALICE.address, vestingToken: await erc20.getAddress(), vestingAmount: vestingAmount, paidAmount: 0, @@ -279,8 +284,8 @@ describe("Vesting", () => { expect(await vesting.getVestedAmount(exponentialVestingId)).to.be.equal(exponentialVesting.vestingAmount); expect(await vesting.getWithdrawableAmount(exponentialVestingId)).to.be.equal(exponentialVesting.vestingAmount); - const linearTx = vesting.connect(alice).withdrawFromVesting(linearVestingId); - const exponentialTx = vesting.connect(alice).withdrawFromVesting(exponentialVestingId); + const linearTx = vesting.connect(ALICE).withdrawFromVesting(linearVestingId); + const exponentialTx = vesting.connect(ALICE).withdrawFromVesting(exponentialVestingId); await expect(linearTx) .to.emit(vesting, "WithdrawnFromVesting") @@ -295,9 +300,9 @@ describe("Vesting", () => { expect(await vesting.getVesting(linearVestingId)).to.deep.equal(Object.values(linearVesting)); expect(await vesting.getVesting(exponentialVestingId)).to.deep.equal(Object.values(exponentialVesting)); - expect(await erc20.balanceOf(alice.address)).changeTokenBalance( + expect(await erc20.balanceOf(ALICE.address)).changeTokenBalance( erc20, - alice.address, + ALICE.address, BigInt(linearVesting.vestingAmount) + BigInt(exponentialVesting.vestingAmount), ); }); @@ -336,8 +341,8 @@ describe("Vesting", () => { expect(await vesting.getVestedAmount(exponentialVestingId)).to.be.equal(exponentialVestedAmount); expect(await vesting.getWithdrawableAmount(exponentialVestingId)).to.be.equal(exponentialVestedAmount); - await vesting.connect(alice).withdrawFromVesting(linearVestingId); - await vesting.connect(alice).withdrawFromVesting(exponentialVestingId); + await vesting.connect(ALICE).withdrawFromVesting(linearVestingId); + await vesting.connect(ALICE).withdrawFromVesting(exponentialVestingId); linearVesting.paidAmount = linearVestedAmount; exponentialVesting.paidAmount = exponentialVestedAmount; @@ -348,9 +353,9 @@ describe("Vesting", () => { expect(await vesting.getWithdrawableAmount(linearVestingId)).to.be.equal(0); expect(await vesting.getWithdrawableAmount(exponentialVestingId)).to.be.equal(0); - expect(await erc20.balanceOf(alice.address)).changeTokenBalance( + expect(await erc20.balanceOf(ALICE.address)).changeTokenBalance( erc20, - alice.address, + ALICE.address, linearVestedAmount + exponentialVestedAmount, ); }); @@ -358,9 +363,9 @@ describe("Vesting", () => { it("should revert if non beneficiary tries to withdraw from vesting", async () => { await vesting.createVesting(linearVesting); - await expect(vesting.withdrawFromVesting(1)).to.be.revertedWith( - "VestingWallet: only beneficiary can withdraw from his vesting", - ); + await expect(vesting.withdrawFromVesting(1)) + .to.be.revertedWithCustomError(vesting, "UnauthorizedAccount") + .withArgs(OWNER); }); it("should revert if nothing to withdraw", async () => { @@ -368,11 +373,11 @@ describe("Vesting", () => { await time.increase(secondsInPeriod * durationInPeriods); - await vesting.connect(alice).withdrawFromVesting(1); + await vesting.connect(ALICE).withdrawFromVesting(1); - await expect(vesting.connect(alice).withdrawFromVesting(1)).to.be.revertedWith( - "VestingWallet: nothing to withdraw", - ); + await expect(vesting.connect(ALICE).withdrawFromVesting(1)) + .to.be.revertedWithCustomError(vesting, "NothingToWithdraw") + .withArgs(); }); }); diff --git a/test/helpers/merkle-tree-helper.ts b/test/helpers/merkle-tree-helper.ts index c33e1349..947f66a5 100644 --- a/test/helpers/merkle-tree-helper.ts +++ b/test/helpers/merkle-tree-helper.ts @@ -2,13 +2,11 @@ import { ethers } from "hardhat"; import { MerkleTree } from "merkletreejs"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; - export function getRoot(tree: MerkleTree): string { const root = tree.getRoot(); if (root.length == 0) { - return ZERO_BYTES32; + return ethers.ZeroHash; } return "0x" + root.toString("hex"); @@ -24,7 +22,7 @@ export function buildTree(leaves: any, hashFn: any = ethers.keccak256): MerkleTr export function buildSparseMerkleTree(leaves: any, height: number, hashFn: any = ethers.keccak256): MerkleTree { const elementsToAdd = 2 ** height - leaves.length; - const zeroHash = hashFn(ZERO_BYTES32); + const zeroHash = hashFn(ethers.ZeroHash); const zeroElements = Array(elementsToAdd).fill(zeroHash); return new MerkleTree([...leaves, ...zeroElements], hashFn, { diff --git a/test/libs/arrays/ArrayHelper.test.ts b/test/libs/arrays/ArrayHelper.test.ts index 3a70e5b0..13a85abd 100644 --- a/test/libs/arrays/ArrayHelper.test.ts +++ b/test/libs/arrays/ArrayHelper.test.ts @@ -1,8 +1,8 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; import { ArrayHelperMock } from "@ethers-v6"; @@ -133,9 +133,11 @@ describe("ArrayHelper", () => { it("should revert if the first index is greater than the last one", async () => { await mock.setArray((await mock.countPrefixes(array)).map((e) => Number(e))); - await expect(mock.getRangeSum(array.length - 1, 0)).to.be.revertedWith("ArrayHelper: wrong range"); - await expect(mock.getRangeSum(1, 0)).to.be.revertedWith("ArrayHelper: wrong range"); - await expect(mock.getRangeSum(2, 1)).to.be.revertedWith("ArrayHelper: wrong range"); + await expect(mock.getRangeSum(array.length - 1, 0)) + .to.be.revertedWithCustomError(mock, "InvalidRange") + .withArgs(array.length - 1, 0); + await expect(mock.getRangeSum(1, 0)).to.be.revertedWithCustomError(mock, "InvalidRange").withArgs(1, 0); + await expect(mock.getRangeSum(2, 1)).to.be.revertedWithCustomError(mock, "InvalidRange").withArgs(2, 1); }); it("should revert if one of the indexes is out of range", async () => { @@ -218,9 +220,9 @@ describe("ArrayHelper", () => { it("should reverse bytes32 array", async () => { const bytes32Arrays = [ - ZERO_BYTES32.replaceAll("0000", "1234"), - ZERO_BYTES32.replaceAll("0000", "4321"), - ZERO_BYTES32.replaceAll("0000", "abcd"), + ethers.ZeroHash.replaceAll("0000", "1234"), + ethers.ZeroHash.replaceAll("0000", "4321"), + ethers.ZeroHash.replaceAll("0000", "abcd"), ]; const arr = await mock.reverseBytes32(bytes32Arrays); @@ -293,9 +295,9 @@ describe("ArrayHelper", () => { it("should insert bytes32 array", async () => { const bytes32Arrays = [ - ZERO_BYTES32.replaceAll("0000", "1111"), - ZERO_BYTES32.replaceAll("0000", "2222"), - ZERO_BYTES32.replaceAll("0000", "3333"), + ethers.ZeroHash.replaceAll("0000", "1111"), + ethers.ZeroHash.replaceAll("0000", "2222"), + ethers.ZeroHash.replaceAll("0000", "3333"), ]; const base = [bytes32Arrays[0], bytes32Arrays[1]]; @@ -341,9 +343,9 @@ describe("ArrayHelper", () => { }); it("should crop bytes32 array properly", async () => { - let arr = await mock.cropBytes([ZERO_BYTES32, ZERO_BYTES32], 1); + let arr = await mock.cropBytes([ethers.ZeroHash, ethers.ZeroHash], 1); - expect(arr).to.deep.equal([ZERO_BYTES32]); + expect(arr).to.deep.equal([ethers.ZeroHash]); }); it("should not crop uint256 array if new length more than initial length", async () => { @@ -371,7 +373,7 @@ describe("ArrayHelper", () => { }); it("should not crop bytes32 array if new length more than initial length", async () => { - let arr = await mock.cropBytes([ZERO_BYTES32, ZERO_BYTES32], 2); + let arr = await mock.cropBytes([ethers.ZeroHash, ethers.ZeroHash], 2); expect(arr.length).to.equal(2); }); diff --git a/test/libs/arrays/SetHelper.test.ts b/test/libs/arrays/SetHelper.test.ts index 669b370c..846bd96a 100644 --- a/test/libs/arrays/SetHelper.test.ts +++ b/test/libs/arrays/SetHelper.test.ts @@ -1,10 +1,10 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { Reverter } from "@/test/helpers/reverter"; import { SetHelperMock } from "@ethers-v6"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; describe("SetHelper", () => { const reverter = new Reverter(); @@ -44,9 +44,9 @@ describe("SetHelper", () => { }); it("should add to bytes32 set", async () => { - await mock.addToBytes32Set([ZERO_BYTES32]); + await mock.addToBytes32Set([ethers.ZeroHash]); - expect(await mock.getBytes32Set()).to.deep.equal([ZERO_BYTES32]); + expect(await mock.getBytes32Set()).to.deep.equal([ethers.ZeroHash]); }); it("should add to bytes set", async () => { @@ -64,31 +64,35 @@ describe("SetHelper", () => { describe("strictAdd", () => { it("should not strict add to address set if element already exists", async () => { - await expect(mock.strictAddToAddressSet([FIRST.address, FIRST.address])).to.be.revertedWith( - "SetHelper: element already exists", - ); + await expect(mock.strictAddToAddressSet([FIRST.address, FIRST.address])) + .to.be.revertedWithCustomError(mock, "ElementAlreadyExistsAddress") + .withArgs(FIRST.address); }); it("should not strict add to uint set if element already exists", async () => { - await expect(mock.strictAddToUintSet([1, 1])).to.be.revertedWith("SetHelper: element already exists"); + await expect(mock.strictAddToUintSet([1, 1])) + .to.be.revertedWithCustomError(mock, "ElementAlreadyExistsUint256") + .withArgs(1); }); it("should not strict add to bytes32 set if element already exists", async () => { - await expect(mock.strictAddToBytes32Set([ZERO_BYTES32, ZERO_BYTES32])).to.be.revertedWith( - "SetHelper: element already exists", - ); + await expect(mock.strictAddToBytes32Set([ethers.ZeroHash, ethers.ZeroHash])) + .to.be.revertedWithCustomError(mock, "ElementAlreadyExistsBytes32") + .withArgs(ethers.ZeroHash); }); it("should not strict add to bytes set if element already exists", async () => { const bytesToAdd = ethers.toUtf8Bytes("1"); - await expect(mock.strictAddToBytesSet([bytesToAdd, bytesToAdd])).to.be.revertedWith( - "SetHelper: element already exists", - ); + await expect(mock.strictAddToBytesSet([bytesToAdd, bytesToAdd])) + .to.be.revertedWithCustomError(mock, "ElementAlreadyExistsBytes") + .withArgs(bytesToAdd); }); it("should not strict add to string set if element already exists", async () => { - await expect(mock.strictAddToStringSet(["1", "1"])).to.be.revertedWith("SetHelper: element already exists"); + await expect(mock.strictAddToStringSet(["1", "1"])) + .to.be.revertedWithCustomError(mock, "ElementAlreadyExistsString") + .withArgs("1"); }); it("should strict add to address set", async () => { @@ -104,9 +108,9 @@ describe("SetHelper", () => { }); it("should strict add to bytes32 set", async () => { - await mock.strictAddToBytes32Set([ZERO_BYTES32]); + await mock.strictAddToBytes32Set([ethers.ZeroHash]); - expect(await mock.getBytes32Set()).to.deep.equal([ZERO_BYTES32]); + expect(await mock.getBytes32Set()).to.deep.equal([ethers.ZeroHash]); }); it("should strict add to bytes set", async () => { @@ -138,8 +142,8 @@ describe("SetHelper", () => { }); it("should remove from bytes32 set", async () => { - await mock.addToBytes32Set([ZERO_BYTES32]); - await mock.removeFromBytes32Set([ZERO_BYTES32]); + await mock.addToBytes32Set([ethers.ZeroHash]); + await mock.removeFromBytes32Set([ethers.ZeroHash]); expect(await mock.getBytes32Set()).to.deep.equal([]); }); @@ -166,37 +170,43 @@ describe("SetHelper", () => { it("should not strict remove from address set if no such element", async () => { await mock.strictAddToAddressSet([FIRST.address, SECOND.address]); - await expect(mock.strictRemoveFromAddressSet([SECOND.address, SECOND.address])).to.be.revertedWith( - "SetHelper: no such element", - ); + await expect(mock.strictRemoveFromAddressSet([SECOND.address, SECOND.address])) + .to.be.revertedWithCustomError(mock, "NoSuchAddress") + .withArgs(SECOND.address); }); it("should not strict remove from uint set if no such element", async () => { await mock.strictAddToUintSet([1]); - await expect(mock.strictRemoveFromUintSet([1, 1])).to.be.revertedWith("SetHelper: no such element"); + await expect(mock.strictRemoveFromUintSet([1, 1])) + .to.be.revertedWithCustomError(mock, "NoSuchUint256") + .withArgs(1); }); it("should not strict remove from bytes32 set if no such element", async () => { - await mock.strictAddToBytes32Set([ZERO_BYTES32]); + await mock.strictAddToBytes32Set([ethers.ZeroHash]); - await expect(mock.strictRemoveFromBytes32Set([ZERO_BYTES32, ZERO_BYTES32])).to.be.revertedWith( - "SetHelper: no such element", - ); + await expect(mock.strictRemoveFromBytes32Set([ethers.ZeroHash, ethers.ZeroHash])) + .to.be.revertedWithCustomError(mock, "NoSuchBytes32") + .withArgs(ethers.ZeroHash); }); it("should not strict remove from string set if no such element", async () => { await mock.strictAddToStringSet(["1", "2", "3"]); - await expect(mock.strictRemoveFromStringSet(["1", "1"])).to.be.revertedWith("SetHelper: no such element"); + await expect(mock.strictRemoveFromStringSet(["1", "1"])) + .to.be.revertedWithCustomError(mock, "NoSuchString") + .withArgs("1"); + ("SetHelper: no such element"); }); it("should not strict remove from bytes set if no such element", async () => { await mock.strictAddToBytesSet([ethers.toUtf8Bytes("1"), ethers.toUtf8Bytes("2"), ethers.toUtf8Bytes("3")]); - await expect(mock.strictRemoveFromBytesSet([ethers.toUtf8Bytes("5")])).to.be.revertedWith( - "SetHelper: no such element", - ); + const bytesToRemove = ethers.toUtf8Bytes("5"); + await expect(mock.strictRemoveFromBytesSet([bytesToRemove])) + .to.be.revertedWithCustomError(mock, "NoSuchBytes") + .withArgs(bytesToRemove); }); it("should strict remove from address set", async () => { @@ -214,8 +224,8 @@ describe("SetHelper", () => { }); it("should strict remove from bytes32 set", async () => { - await mock.strictAddToBytes32Set([ZERO_BYTES32]); - await mock.strictRemoveFromBytes32Set([ZERO_BYTES32]); + await mock.strictAddToBytes32Set([ethers.ZeroHash]); + await mock.strictRemoveFromBytes32Set([ethers.ZeroHash]); expect(await mock.getBytes32Set()).to.deep.equal([]); }); diff --git a/test/libs/data-structures/AvlTree.test.ts b/test/libs/data-structures/AvlTree.test.ts index 51847075..21c5e902 100644 --- a/test/libs/data-structures/AvlTree.test.ts +++ b/test/libs/data-structures/AvlTree.test.ts @@ -1,13 +1,12 @@ import { ethers } from "hardhat"; -import { encodeBytes32String } from "ethers"; import { expect } from "chai"; -import { Reverter } from "@/test/helpers/reverter"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { encodeBytes32String, toBeHex } from "ethers"; -import { AvlTreeMock } from "@ethers-v6"; +import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; +import { AvlTreeMock } from "@ethers-v6"; describe("AvlTree", () => { const reverter = new Reverter(); @@ -122,12 +121,16 @@ describe("AvlTree", () => { }); it("should not allow to insert 0 as key to the uint tree", async () => { - await expect(avlTree.insertUint(0, 100)).to.be.revertedWith("AvlTree: key is not allowed to be 0"); + await expect(avlTree.insertUint(0, 100)).to.be.revertedWithCustomError(avlTree, "KeyIsZero").withArgs(); }); it("should not allow to insert node with duplicate key to the uint tree", async () => { - await avlTree.insertUint(2, 10); - await expect(avlTree.insertUint(2, 4)).to.be.revertedWith("AvlTree: the node already exists"); + const key = 2; + await avlTree.insertUint(key, 10); + + await expect(avlTree.insertUint(key, 4)) + .to.be.revertedWithCustomError(avlTree, "NodeAlreadyExists") + .withArgs(toBeHex(key, 32)); }); }); @@ -220,21 +223,28 @@ describe("AvlTree", () => { it("should not allow to remove a node that doesn't exist in the uint tree", async () => { await avlTree.insertUint(1, 10); - await expect(avlTree.removeUint(2)).to.be.revertedWith("AvlTree: the node doesn't exist"); - await expect(avlTree.removeUint(0)).to.be.revertedWith("AvlTree: key is not allowed to be 0"); + await expect(avlTree.removeUint(2)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(2, 32)); + await expect(avlTree.removeUint(0)).to.be.revertedWithCustomError(avlTree, "KeyIsZero").withArgs(); }); it("should not allow to remove a node twice in the uint tree", async () => { + const key = 2; await avlTree.insertUint(1, 10); - await avlTree.insertUint(2, 20); + await avlTree.insertUint(key, 20); - await avlTree.removeUint(2); + await avlTree.removeUint(key); - await expect(avlTree.removeUint(2)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.removeUint(key)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(key, 32)); }); it("should not allow to remove nodes in the empty uint tree", async () => { - await expect(avlTree.removeUint(1)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.removeUint(1)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(1, 32)); }); }); @@ -260,7 +270,7 @@ describe("AvlTree", () => { it("should not allow to set comparator for the uint tree if the tree is not empty", async () => { await avlTree.insertUint(1, 10); - await expect(avlTree.setUintDescComparator()).to.be.revertedWith("AvlTree: the tree must be empty"); + await expect(avlTree.setUintDescComparator()).to.be.revertedWithCustomError(avlTree, "TreeNotEmpty").withArgs(); }); }); @@ -279,23 +289,33 @@ describe("AvlTree", () => { expect(await avlTree.getUint(3)).to.be.equal(1); expect(await avlTree.tryGetUint(3)).to.deep.equal([true, 1]); - await expect(avlTree.getUint(4)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getUint(4)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(4, 32)); expect(await avlTree.tryGetUint(4)).to.deep.equal([false, 0]); - await expect(avlTree.getUint(6)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getUint(6)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(6, 32)); expect(await avlTree.tryGetUint(6)).to.deep.equal([false, 0]); }); it("should handle getting value for the non-existing node in the uint tree correctly", async () => { - await expect(avlTree.getUint(1)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getUint(1)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(1, 32)); expect(await avlTree.tryGetUint(1)).to.deep.equal([false, 0]); await avlTree.insertUint(1, 30); - await expect(avlTree.getUint(2)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getUint(2)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(2, 32)); expect(await avlTree.tryGetUint(2)).to.deep.equal([false, 0]); - await expect(avlTree.getUint(0)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getUint(0)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(0, 32)); expect(await avlTree.tryGetUint(0)).to.deep.equal([false, 0]); }); @@ -337,7 +357,7 @@ describe("AvlTree", () => { expect(await avlTree.nextOnLast()).to.deep.equal([0, 0]); expect(await avlTree.prevOnFirst()).to.deep.equal([0, 0]); - await expect(avlTree.brokenTraversalUint()).to.be.revertedWith("Traversal: no more nodes"); + await expect(avlTree.brokenTraversalUint()).to.be.revertedWithCustomError(avlTree, "NoNodesLeft").withArgs(); }); it("should maintain idempotent traversal", async () => { @@ -400,7 +420,9 @@ describe("AvlTree", () => { expect(await avlTree.rootBytes32()).to.equal(4); expect(await avlTree.sizeBytes32()).to.equal(3); - await expect(avlTree.getBytes32(2)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(2)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(2, 32)); expect(await avlTree.tryGetBytes32(2)).to.deep.equal([false, 0]); let traversal = await avlTree.traverseBytes32(); @@ -420,10 +442,14 @@ describe("AvlTree", () => { expect(await avlTree.getBytes32(2)).to.be.equal(encodeBytes32String("2")); expect(await avlTree.tryGetBytes32(2)).to.deep.equal([true, encodeBytes32String("2")]); - await expect(avlTree.getBytes32(1)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(1)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(1, 32)); expect(await avlTree.tryGetBytes32(1)).to.deep.equal([false, encodeBytes32String("")]); - await expect(avlTree.getBytes32(3)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(3)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(3, 32)); expect(await avlTree.tryGetBytes32(3)).to.deep.equal([false, encodeBytes32String("")]); traversal = await avlTree.traverseBytes32(); @@ -440,7 +466,9 @@ describe("AvlTree", () => { }); it("should handle getting value in the bytes32 tree correctly", async () => { - await expect(avlTree.getBytes32(1)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(1)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(1, 32)); expect(await avlTree.tryGetBytes32(1)).to.deep.equal([false, encodeBytes32String("")]); await avlTree.insertBytes32(1, encodeBytes32String("")); @@ -452,10 +480,14 @@ describe("AvlTree", () => { expect(await avlTree.getBytes32(2)).to.be.equal(encodeBytes32String("2")); expect(await avlTree.tryGetBytes32(2)).to.deep.equal([true, encodeBytes32String("2")]); - await expect(avlTree.getBytes32(3)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(3)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(3, 32)); expect(await avlTree.tryGetBytes32(3)).to.deep.equal([false, encodeBytes32String("")]); - await expect(avlTree.getBytes32(0)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getBytes32(0)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(0, 32)); expect(await avlTree.tryGetBytes32(0)).to.deep.equal([false, encodeBytes32String("")]); }); @@ -530,8 +562,10 @@ describe("AvlTree", () => { expect(await avlTree.rootAddress()).to.equal(5); expect(await avlTree.sizeAddress()).to.equal(3); - await expect(avlTree.getAddressValue(2)).to.be.revertedWith("AvlTree: the node doesn't exist"); - expect(await avlTree.tryGetAddress(2)).to.deep.equal([false, ZERO_ADDR]); + await expect(avlTree.getAddressValue(2)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(2, 32)); + expect(await avlTree.tryGetAddress(2)).to.deep.equal([false, ethers.ZeroAddress]); let traversal = await avlTree.traverseAddress(); expect(traversal[0]).to.deep.equal([6, 5, 1]); @@ -553,11 +587,15 @@ describe("AvlTree", () => { expect(await avlTree.getAddressValue(1)).to.be.equal(USER2); expect(await avlTree.tryGetAddress(1)).to.deep.equal([true, USER2.address]); - await expect(avlTree.getAddressValue(3)).to.be.revertedWith("AvlTree: the node doesn't exist"); + await expect(avlTree.getAddressValue(3)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(3, 32)); expect(await avlTree.tryGetAddress(3)).to.deep.equal([false, 0]); - await expect(avlTree.getAddressValue(5)).to.be.revertedWith("AvlTree: the node doesn't exist"); - expect(await avlTree.tryGetAddress(5)).to.deep.equal([false, ZERO_ADDR]); + await expect(avlTree.getAddressValue(5)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(5, 32)); + expect(await avlTree.tryGetAddress(5)).to.deep.equal([false, ethers.ZeroAddress]); traversal = await avlTree.traverseAddress(); expect(traversal[0]).to.deep.equal([6, 4, 2, 1]); @@ -577,23 +615,29 @@ describe("AvlTree", () => { }); it("should handle getting value in the address tree correctly", async () => { - await expect(avlTree.getAddressValue(1)).to.be.revertedWith("AvlTree: the node doesn't exist"); - expect(await avlTree.tryGetAddress(1)).to.deep.equal([false, ZERO_ADDR]); + await expect(avlTree.getAddressValue(1)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(1, 32)); + expect(await avlTree.tryGetAddress(1)).to.deep.equal([false, ethers.ZeroAddress]); await avlTree.insertAddress(1, USER2); - await avlTree.insertAddress(2, ZERO_ADDR); + await avlTree.insertAddress(2, ethers.ZeroAddress); expect(await avlTree.getAddressValue(1)).to.be.equal(USER2); expect(await avlTree.tryGetAddress(1)).to.deep.equal([true, USER2.address]); - expect(await avlTree.getAddressValue(2)).to.be.equal(ZERO_ADDR); - expect(await avlTree.tryGetAddress(2)).to.deep.equal([true, ZERO_ADDR]); + expect(await avlTree.getAddressValue(2)).to.be.equal(ethers.ZeroAddress); + expect(await avlTree.tryGetAddress(2)).to.deep.equal([true, ethers.ZeroAddress]); - await expect(avlTree.getAddressValue(5)).to.be.revertedWith("AvlTree: the node doesn't exist"); - expect(await avlTree.tryGetAddress(5)).to.deep.equal([false, ZERO_ADDR]); + await expect(avlTree.getAddressValue(5)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(5, 32)); + expect(await avlTree.tryGetAddress(5)).to.deep.equal([false, ethers.ZeroAddress]); - await expect(avlTree.getAddressValue(0)).to.be.revertedWith("AvlTree: the node doesn't exist"); - expect(await avlTree.tryGetAddress(0)).to.deep.equal([false, ZERO_ADDR]); + await expect(avlTree.getAddressValue(0)) + .to.be.revertedWithCustomError(avlTree, "NodeDoesNotExist") + .withArgs(toBeHex(0, 32)); + expect(await avlTree.tryGetAddress(0)).to.deep.equal([false, ethers.ZeroAddress]); }); it("should check if custom comparator is set for the address tree correctly", async () => { diff --git a/test/libs/data-structures/DynamicSet.test.ts b/test/libs/data-structures/DynamicSet.test.ts index 96314365..d85c2508 100644 --- a/test/libs/data-structures/DynamicSet.test.ts +++ b/test/libs/data-structures/DynamicSet.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { DynamicSetMock } from "@ethers-v6"; diff --git a/test/libs/data-structures/IncrementalMerkleTree.test.ts b/test/libs/data-structures/IncrementalMerkleTree.test.ts index 8242ee07..b6ec6232 100644 --- a/test/libs/data-structures/IncrementalMerkleTree.test.ts +++ b/test/libs/data-structures/IncrementalMerkleTree.test.ts @@ -1,16 +1,15 @@ import { expect } from "chai"; import { ethers } from "hardhat"; -import { MerkleTree } from "merkletreejs"; - -import { IncrementalMerkleTreeMock } from "@ethers-v6"; - import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { MerkleTree } from "merkletreejs"; import { Reverter } from "@/test/helpers/reverter"; import { getPoseidon, poseidonHash } from "@/test/helpers/poseidon-hash"; import { getRoot, buildSparseMerkleTree } from "@/test/helpers/merkle-tree-helper"; +import { IncrementalMerkleTreeMock } from "@ethers-v6"; + describe("IncrementalMerkleTree", () => { const reverter = new Reverter(); const coder = ethers.AbiCoder.defaultAbiCoder(); @@ -125,9 +124,9 @@ describe("IncrementalMerkleTree", () => { expect(await merkleTree.isUnitHashFnSet()).to.be.true; - await expect(merkleTree.setUintPoseidonHasher()).to.be.rejectedWith( - "IncrementalMerkleTree: the tree must be empty", - ); + await expect(merkleTree.setUintPoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should return zeroHash if tree is empty", async () => { @@ -135,9 +134,9 @@ describe("IncrementalMerkleTree", () => { }); it("should revert if an attempt is made to set the tree height lower than the current one", async () => { - await expect(merkleTree.setUintTreeHeight(0)).to.be.rejectedWith( - "IncrementalMerkleTree: the height must be greater than the current one", - ); + await expect(merkleTree.setUintTreeHeight(0)) + .to.be.revertedWithCustomError(merkleTree, "NewHeightMustBeGreater") + .withArgs(await merkleTree.getUintTreeHeight(), 0); }); it("should revert if the set tree height's limit is reached", async () => { @@ -145,7 +144,7 @@ describe("IncrementalMerkleTree", () => { await merkleTree.addUint(1); - await expect(merkleTree.addUint(2)).to.be.rejectedWith("IncrementalMerkleTree: the tree is full"); + await expect(merkleTree.addUint(2)).to.be.revertedWithCustomError(merkleTree, "TreeIsFull").withArgs(); }); }); @@ -225,9 +224,9 @@ describe("IncrementalMerkleTree", () => { expect(await merkleTree.isBytes32HashFnSet()).to.be.true; - await expect(merkleTree.setBytes32PoseidonHasher()).to.be.rejectedWith( - "IncrementalMerkleTree: the tree must be empty", - ); + await expect(merkleTree.setBytes32PoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should return zeroHash if tree is empty", async () => { @@ -235,9 +234,9 @@ describe("IncrementalMerkleTree", () => { }); it("should revert if an attempt is made to set the tree height lower than the current one", async () => { - await expect(merkleTree.setBytes32TreeHeight(0)).to.be.rejectedWith( - "IncrementalMerkleTree: the height must be greater than the current one", - ); + await expect(merkleTree.setBytes32TreeHeight(0)) + .to.be.revertedWithCustomError(merkleTree, "NewHeightMustBeGreater") + .withArgs(await merkleTree.getBytes32TreeHeight(), 0); }); it("should revert if the set tree height's limit is reached", async () => { @@ -245,9 +244,9 @@ describe("IncrementalMerkleTree", () => { await merkleTree.addBytes32(ethers.ZeroHash); - await expect(merkleTree.addBytes32(ethers.ZeroHash)).to.be.rejectedWith( - "IncrementalMerkleTree: the tree is full", - ); + await expect(merkleTree.addBytes32(ethers.ZeroHash)) + .to.be.revertedWithCustomError(merkleTree, "TreeIsFull") + .withArgs(); }); }); @@ -327,9 +326,9 @@ describe("IncrementalMerkleTree", () => { expect(await merkleTree.isAddressHashFnSet()).to.be.true; - await expect(merkleTree.setAddressPoseidonHasher()).to.be.rejectedWith( - "IncrementalMerkleTree: the tree must be empty", - ); + await expect(merkleTree.setAddressPoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should return zeroHash if tree is empty", async () => { @@ -337,9 +336,9 @@ describe("IncrementalMerkleTree", () => { }); it("should revert if an attempt is made to set the tree height lower than the current one", async () => { - await expect(merkleTree.setAddressTreeHeight(0)).to.be.rejectedWith( - "IncrementalMerkleTree: the height must be greater than the current one", - ); + await expect(merkleTree.setAddressTreeHeight(0)) + .to.be.revertedWithCustomError(merkleTree, "NewHeightMustBeGreater") + .withArgs(await merkleTree.getAddressTreeHeight(), 0); }); it("should revert if the set tree height's limit is reached", async () => { @@ -347,7 +346,9 @@ describe("IncrementalMerkleTree", () => { await merkleTree.addAddress(USER1.address); - await expect(merkleTree.addAddress(USER1.address)).to.be.rejectedWith("IncrementalMerkleTree: the tree is full"); + await expect(merkleTree.addAddress(USER1.address)) + .to.be.revertedWithCustomError(merkleTree, "TreeIsFull") + .withArgs(); }); }); }); diff --git a/test/libs/data-structures/PriorityQueue.test.ts b/test/libs/data-structures/PriorityQueue.test.ts index 8130b369..1d232450 100644 --- a/test/libs/data-structures/PriorityQueue.test.ts +++ b/test/libs/data-structures/PriorityQueue.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { PriorityQueueMock } from "@ethers-v6"; @@ -153,9 +154,9 @@ describe("PriorityQueue", () => { }); it("should not remove elements from an empty queue", async () => { - await expect(mock.topValueUint()).to.be.revertedWith("PriorityQueue: empty queue"); - await expect(mock.topUint()).to.be.revertedWith("PriorityQueue: empty queue"); - await expect(mock.removeTopUint()).to.be.revertedWith("PriorityQueue: empty queue"); + await expect(mock.topValueUint()).to.be.revertedWithCustomError(mock, "QueueIsEmpty").withArgs(); + await expect(mock.topUint()).to.be.revertedWithCustomError(mock, "QueueIsEmpty").withArgs(); + await expect(mock.removeTopUint()).to.be.revertedWithCustomError(mock, "QueueIsEmpty").withArgs(); }); }); diff --git a/test/libs/data-structures/SparseMerkleTree.test.ts b/test/libs/data-structures/SparseMerkleTree.test.ts index 666deff8..d070b9e4 100644 --- a/test/libs/data-structures/SparseMerkleTree.test.ts +++ b/test/libs/data-structures/SparseMerkleTree.test.ts @@ -1,18 +1,18 @@ -import { expect } from "chai"; import { ethers } from "hardhat"; - -import { Hash, LocalStorageDB, Merkletree, Proof, str2Bytes, verifyProof } from "@iden3/js-merkletree"; - -import { SparseMerkleTreeMock } from "@ethers-v6"; -import { SparseMerkleTree } from "@/generated-types/ethers/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol/SparseMerkleTreeMock"; +import { expect } from "chai"; import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { toBeHex } from "ethers"; + +import { Hash, LocalStorageDB, Merkletree, Proof, str2Bytes, verifyProof } from "@iden3/js-merkletree"; import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_BYTES32 } from "@/scripts/utils/constants"; import { getPoseidon, poseidonHash } from "@/test/helpers/poseidon-hash"; +import { SparseMerkleTreeMock } from "@ethers-v6"; + import "mock-local-storage"; +import { SparseMerkleTree } from "@/generated-types/ethers/contracts/mock/libs/data-structures/SparseMerkleTreeMock.sol/SparseMerkleTreeMock"; describe("SparseMerkleTree", () => { const reverter = new Reverter(); @@ -52,7 +52,7 @@ describe("SparseMerkleTree", () => { }); async function getRoot(tree: Merkletree): Promise { - return ethers.toBeHex((await tree.root()).bigInt(), 32); + return toBeHex((await tree.root()).bigInt(), 32); } function getOnchainProof(onchainProof: SparseMerkleTree.ProofStructOutput): Proof { @@ -83,8 +83,8 @@ describe("SparseMerkleTree", () => { async function compareNodes(node: SparseMerkleTree.NodeStructOutput, key: bigint) { const localNode = await localMerkleTree.get(key); - expect(node.key).to.equal(ethers.toBeHex(localNode.key, 32)); - expect(node.value).to.equal(ethers.toBeHex(localNode.value, 32)); + expect(node.key).to.equal(toBeHex(localNode.key, 32)); + expect(node.value).to.equal(toBeHex(localNode.value, 32)); } describe("Uint SMT", () => { @@ -94,23 +94,23 @@ describe("SparseMerkleTree", () => { }); it("should not initialize twice", async () => { - await expect(merkleTree.initializeUintTree(20)).to.be.rejectedWith( - "SparseMerkleTree: tree is already initialized", - ); + await expect(merkleTree.initializeUintTree(20)) + .to.be.revertedWithCustomError(merkleTree, "TreeAlreadyInitialized") + .withArgs(); }); it("should revert if trying to set incorrect max depth", async () => { - await expect(merkleTree.setMaxDepthUintTree(0)).to.be.rejectedWith( - "SparseMerkleTree: max depth must be greater than zero", - ); + await expect(merkleTree.setMaxDepthUintTree(0)) + .to.be.revertedWithCustomError(merkleTree, "MaxDepthIsZero") + .withArgs(); - await expect(merkleTree.setMaxDepthUintTree(15)).to.be.rejectedWith( - "SparseMerkleTree: max depth can only be increased", - ); + await expect(merkleTree.setMaxDepthUintTree(15)) + .to.be.revertedWithCustomError(merkleTree, "NewMaxDepthMustBeLarger") + .withArgs(merkleTree.getUintMaxDepth(), 15); - await expect(merkleTree.setMaxDepthUintTree(300)).to.be.rejectedWith( - "SparseMerkleTree: max depth is greater than hard cap", - ); + await expect(merkleTree.setMaxDepthUintTree(300)) + .to.be.revertedWithCustomError(merkleTree, "MaxDepthExceedsHardCap") + .withArgs(300); }); it("should set max depth bigger than the current one", async () => { @@ -128,20 +128,22 @@ describe("SparseMerkleTree", () => { }); const newMerkleTree = await SparseMerkleTreeMock.deploy(); - await expect(newMerkleTree.addUint(ethers.toBeHex(1n, 32), 1n)).to.be.rejectedWith( - "SparseMerkleTree: tree is not initialized", - ); - await expect(newMerkleTree.removeUint(ethers.toBeHex(1n, 32))).to.be.rejectedWith( - "SparseMerkleTree: tree is not initialized", - ); - await expect(newMerkleTree.updateUint(ethers.toBeHex(1n, 32), 1n)).to.be.rejectedWith( - "SparseMerkleTree: tree is not initialized", - ); + await expect(newMerkleTree.addUint(toBeHex(1n, 32), 1n)) + .to.be.revertedWithCustomError(merkleTree, "TreeNotInitialized") + .withArgs(); + + await expect(newMerkleTree.removeUint(toBeHex(1n, 32))) + .to.be.revertedWithCustomError(merkleTree, "TreeNotInitialized") + .withArgs(); + + await expect(newMerkleTree.updateUint(toBeHex(1n, 32), 1n)) + .to.be.revertedWithCustomError(merkleTree, "TreeNotInitialized") + .withArgs(); }); it("should build a Merkle Tree of a predefined size with correct initial values", async () => { const value = 2341n; - const key = poseidonHash(ethers.toBeHex(value)); + const key = poseidonHash(toBeHex(value)); expect(await merkleTree.getUintRoot()).to.equal(await getRoot(localMerkleTree)); @@ -164,8 +166,8 @@ describe("SparseMerkleTree", () => { it("should build a Merkle Tree correctly with multiple elements", async () => { for (let i = 1n; i < 20n; i++) { - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); - const key = poseidonHash(ethers.toBeHex(`0x` + value.toString(16), 32)); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = poseidonHash(toBeHex(`0x` + value.toString(16), 32)); await merkleTree.addUint(key, value); @@ -181,15 +183,17 @@ describe("SparseMerkleTree", () => { expect(await merkleTree.isUintCustomHasherSet()).to.be.true; - await expect(merkleTree.setUintPoseidonHasher()).to.be.rejectedWith("SparseMerkleTree: tree is not empty"); + await expect(merkleTree.setUintPoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should add and full remove elements from Merkle Tree correctly", async () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); - const key = poseidonHash(ethers.toBeHex(`0x` + value.toString(16), 32)); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = poseidonHash(toBeHex(`0x` + value.toString(16), 32)); await merkleTree.addUint(key, value); @@ -197,12 +201,12 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); + const key = toBeHex(keys[Number(i) - 1], 32); await merkleTree.removeUint(key); } - expect(await merkleTree.getUintRoot()).to.equal(ZERO_BYTES32); + expect(await merkleTree.getUintRoot()).to.equal(ethers.ZeroHash); expect(await merkleTree.getUintNodesCount()).to.equal(0); @@ -215,15 +219,15 @@ describe("SparseMerkleTree", () => { let proof; for (let i = 1n; i < 20n; i++) { - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); - const key = poseidonHash(ethers.toBeHex(`0x` + value.toString(16), 32)); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = poseidonHash(toBeHex(`0x` + value.toString(16), 32)); await merkleTree.addUint(key, value); if (i > 1n) { await merkleTree.removeUint(key); - const hexKey = ethers.toBeHex(keys[Number(i - 2n)], 32); + const hexKey = toBeHex(keys[Number(i - 2n)], 32); expect(await merkleTree.getUintProof(hexKey)).to.deep.equal(proof); await merkleTree.addUint(key, value); @@ -235,7 +239,7 @@ describe("SparseMerkleTree", () => { } for (let key of keys) { - const hexKey = ethers.toBeHex(key, 32); + const hexKey = toBeHex(key, 32); const value = (await merkleTree.getUintNodeByKey(hexKey)).value; proof = await merkleTree.getUintProof(hexKey); @@ -252,7 +256,7 @@ describe("SparseMerkleTree", () => { const keys = [7n, 1n, 5n]; for (let key of keys) { - const hexKey = ethers.toBeHex(key, 32); + const hexKey = toBeHex(key, 32); await merkleTree.addUint(hexKey, key); } @@ -263,7 +267,7 @@ describe("SparseMerkleTree", () => { expect(await merkleTree.getUintNodesCount()).to.equal(6); for (let key of keys) { - const hexKey = ethers.toBeHex(key, 32); + const hexKey = toBeHex(key, 32); await merkleTree.removeUint(hexKey); await merkleTree.addUint(hexKey, key); @@ -277,25 +281,26 @@ describe("SparseMerkleTree", () => { const keys = [7n, 1n, 5n]; for (let key of keys) { - const hexKey = ethers.toBeHex(key, 32); + const hexKey = toBeHex(key, 32); await merkleTree.addUint(hexKey, key); } - await expect(merkleTree.removeUint(ethers.toBeHex(8, 32))).to.be.revertedWith( - "SparseMerkleTree: the node does not exist", - ); - await expect(merkleTree.removeUint(ethers.toBeHex(9, 32))).to.be.revertedWith( - "SparseMerkleTree: the leaf does not match", - ); + await expect(merkleTree.removeUint(toBeHex(8, 32))) + .to.be.revertedWithCustomError(merkleTree, "NodeDoesNotExist") + .withArgs(0); + + await expect(merkleTree.removeUint(toBeHex(9, 32))) + .to.be.revertedWithCustomError(merkleTree, "LeafDoesNotMatch") + .withArgs(toBeHex(1, 32), toBeHex(9, 32)); }); it("should update existing leaves", async () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); - const key = poseidonHash(ethers.toBeHex(`0x` + value.toString(16), 32)); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = poseidonHash(toBeHex(`0x` + value.toString(16), 32)); await merkleTree.addUint(key, value); await localMerkleTree.add(BigInt(key), value); @@ -304,8 +309,8 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = toBeHex(keys[Number(i) - 1], 32); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); await merkleTree.updateUint(key, value); await localMerkleTree.update(BigInt(key), value); @@ -323,29 +328,30 @@ describe("SparseMerkleTree", () => { const keys = [7n, 1n, 5n]; for (let key of keys) { - const hexKey = ethers.toBeHex(key, 32); + const hexKey = toBeHex(key, 32); await merkleTree.addUint(hexKey, key); } - await expect(merkleTree.updateUint(ethers.toBeHex(8, 32), 1n)).to.be.revertedWith( - "SparseMerkleTree: the node does not exist", - ); - await expect(merkleTree.updateUint(ethers.toBeHex(9, 32), 1n)).to.be.revertedWith( - "SparseMerkleTree: the leaf does not match", - ); + await expect(merkleTree.updateUint(toBeHex(8, 32), 1n)) + .to.be.revertedWithCustomError(merkleTree, "NodeDoesNotExist") + .withArgs(0); + + await expect(merkleTree.updateUint(toBeHex(9, 32), 1n)) + .to.be.revertedWithCustomError(merkleTree, "LeafDoesNotMatch") + .withArgs(toBeHex(1, 32), toBeHex(9, 32)); }); it("should generate empty proof on empty tree", async () => { - const onchainProof = getOnchainProof(await merkleTree.getUintProof(ethers.toBeHex(1n, 32))); + const onchainProof = getOnchainProof(await merkleTree.getUintProof(toBeHex(1n, 32))); expect(onchainProof.allSiblings()).to.have.length(0); }); it("should generate an empty proof for but with aux fields", async () => { - await merkleTree.addUint(ethers.toBeHex(7n, 32), 1n); + await merkleTree.addUint(toBeHex(7n, 32), 1n); - const onchainProof = await merkleTree.getUintProof(ethers.toBeHex(5n, 32)); + const onchainProof = await merkleTree.getUintProof(toBeHex(5n, 32)); expect(onchainProof.auxKey).to.equal(7n); expect(onchainProof.auxValue).to.equal(1n); @@ -357,23 +363,25 @@ describe("SparseMerkleTree", () => { await localMerkleTree.add(3n, 15n); // key -> 0b011 await localMerkleTree.add(7n, 15n); // key -> 0b111 - await merkleTree.addUint(ethers.toBeHex(3n, 32), 15n); - await merkleTree.addUint(ethers.toBeHex(7n, 32), 15n); + await merkleTree.addUint(toBeHex(3n, 32), 15n); + await merkleTree.addUint(toBeHex(7n, 32), 15n); - let onchainProof = getOnchainProof(await merkleTree.getUintProof(ethers.toBeHex(5n, 32))); + let onchainProof = getOnchainProof(await merkleTree.getUintProof(toBeHex(5n, 32))); expect(await verifyProof(await localMerkleTree.root(), onchainProof, 5n, 0n)).to.be.true; - onchainProof = getOnchainProof(await merkleTree.getUintProof(ethers.toBeHex(15n, 32))); + onchainProof = getOnchainProof(await merkleTree.getUintProof(toBeHex(15n, 32))); expect(await verifyProof(await localMerkleTree.root(), onchainProof, 15n, 15n)).to.be.true; }); it("should revert if trying to add a node with the same key", async () => { const value = 2341n; - const key = poseidonHash(ethers.toBeHex(value)); + const key = poseidonHash(toBeHex(value)); await merkleTree.addUint(key, value); - await expect(merkleTree.addUint(key, value)).to.be.rejectedWith("SparseMerkleTree: the key already exists"); + await expect(merkleTree.addUint(key, value)) + .to.be.revertedWithCustomError(merkleTree, "KeyAlreadyExists") + .withArgs(key); }); it("should revert if max depth is reached", async () => { @@ -387,18 +395,18 @@ describe("SparseMerkleTree", () => { await newMerkleTree.initializeUintTree(1); - await newMerkleTree.addUint(ethers.toBeHex(1n, 32), 1n); - await newMerkleTree.addUint(ethers.toBeHex(2n, 32), 1n); + await newMerkleTree.addUint(toBeHex(1n, 32), 1n); + await newMerkleTree.addUint(toBeHex(2n, 32), 1n); - await expect(newMerkleTree.addUint(ethers.toBeHex(3n, 32), 1n)).to.be.rejectedWith( - "SparseMerkleTree: max depth reached", - ); + await expect(newMerkleTree.addUint(toBeHex(3n, 32), 1n)) + .to.be.revertedWithCustomError(merkleTree, "MaxDepthReached") + .withArgs(); }); it("should get empty Node by non-existing key", async () => { expect((await merkleTree.getUintNodeByKey(1n)).nodeType).to.be.equal(0); - await merkleTree.addUint(ethers.toBeHex(7n, 32), 1n); + await merkleTree.addUint(toBeHex(7n, 32), 1n); expect((await merkleTree.getUintNodeByKey(5n)).nodeType).to.be.equal(0); }); @@ -413,13 +421,13 @@ describe("SparseMerkleTree", () => { }); it("should not initialize twice", async () => { - await expect(merkleTree.initializeBytes32Tree(20)).to.be.rejectedWith( - "SparseMerkleTree: tree is already initialized", - ); + await expect(merkleTree.initializeBytes32Tree(20)) + .to.be.revertedWithCustomError(merkleTree, "TreeAlreadyInitialized") + .withArgs(); }); it("should build a Merkle Tree of a predefined size with correct initial values", async () => { - const value = ethers.toBeHex("0x1235", 32); + const value = toBeHex("0x1235", 32); const key = poseidonHash(value); await merkleTree.addBytes32(key, value); @@ -441,7 +449,7 @@ describe("SparseMerkleTree", () => { it("should build a Merkle Tree correctly with multiple elements", async () => { for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); + const value = toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); const key = poseidonHash(value); await merkleTree.addBytes32(key, value); @@ -458,14 +466,16 @@ describe("SparseMerkleTree", () => { expect(await merkleTree.isBytes32CustomHasherSet()).to.be.true; - await expect(merkleTree.setBytes32PoseidonHasher()).to.be.rejectedWith("SparseMerkleTree: tree is not empty"); + await expect(merkleTree.setBytes32PoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should add and full remove elements from Merkle Tree correctly", async () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); + const value = toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); const key = poseidonHash(value); await merkleTree.addBytes32(key, value); @@ -474,12 +484,12 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); + const key = toBeHex(keys[Number(i) - 1], 32); await merkleTree.removeBytes32(key); } - expect(await merkleTree.getBytes32Root()).to.equal(ZERO_BYTES32); + expect(await merkleTree.getBytes32Root()).to.equal(ethers.ZeroHash); expect(await merkleTree.getBytes32NodesCount()).to.equal(0); @@ -491,7 +501,7 @@ describe("SparseMerkleTree", () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); + const value = toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32); const key = poseidonHash(value); await merkleTree.addBytes32(key, value); @@ -501,10 +511,10 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); - const value = BigInt(ethers.toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); + const key = toBeHex(keys[Number(i) - 1], 32); + const value = BigInt(toBeHex(ethers.hexlify(ethers.randomBytes(28)), 32)); - await merkleTree.updateBytes32(key, ethers.toBeHex(value, 32)); + await merkleTree.updateBytes32(key, toBeHex(value, 32)); await localMerkleTree.update(BigInt(key), BigInt(value)); expect(await merkleTree.getBytes32Root()).to.equal(await getRoot(localMerkleTree)); @@ -526,9 +536,9 @@ describe("SparseMerkleTree", () => { }); it("should not initialize twice", async () => { - await expect(merkleTree.initializeAddressTree(20)).to.be.rejectedWith( - "SparseMerkleTree: tree is already initialized", - ); + await expect(merkleTree.initializeAddressTree(20)) + .to.be.revertedWithCustomError(merkleTree, "TreeAlreadyInitialized") + .withArgs(); }); it("should build a Merkle Tree of a predefined size with correct initial values", async () => { @@ -554,7 +564,7 @@ describe("SparseMerkleTree", () => { it("should build a Merkle Tree correctly with multiple elements", async () => { for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(BigInt(await USER1.getAddress()) + i); + const value = toBeHex(BigInt(await USER1.getAddress()) + i); const key = poseidonHash(value); await merkleTree.addAddress(key, value); @@ -571,14 +581,16 @@ describe("SparseMerkleTree", () => { expect(await merkleTree.isAddressCustomHasherSet()).to.be.true; - await expect(merkleTree.setAddressPoseidonHasher()).to.be.rejectedWith("SparseMerkleTree: tree is not empty"); + await expect(merkleTree.setAddressPoseidonHasher()) + .to.be.revertedWithCustomError(merkleTree, "TreeIsNotEmpty") + .withArgs(); }); it("should add and full remove elements from Merkle Tree correctly", async () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(BigInt(await USER1.getAddress()) + i); + const value = toBeHex(BigInt(await USER1.getAddress()) + i); const key = poseidonHash(value); await merkleTree.addAddress(key, value); @@ -587,12 +599,12 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); + const key = toBeHex(keys[Number(i) - 1], 32); await merkleTree.removeAddress(key); } - expect(await merkleTree.getAddressRoot()).to.equal(ZERO_BYTES32); + expect(await merkleTree.getAddressRoot()).to.equal(ethers.ZeroHash); expect(await merkleTree.getAddressNodesCount()).to.equal(0); @@ -604,7 +616,7 @@ describe("SparseMerkleTree", () => { const keys: string[] = []; for (let i = 1n; i < 20n; i++) { - const value = ethers.toBeHex(BigInt(await USER1.getAddress()) + i); + const value = toBeHex(BigInt(await USER1.getAddress()) + i); const key = poseidonHash(value); await merkleTree.addAddress(key, value); @@ -614,10 +626,10 @@ describe("SparseMerkleTree", () => { } for (let i = 1n; i < 20n; i++) { - const key = ethers.toBeHex(keys[Number(i) - 1], 32); - const value = ethers.toBeHex(ethers.hexlify(ethers.randomBytes(20))); + const key = toBeHex(keys[Number(i) - 1], 32); + const value = toBeHex(ethers.hexlify(ethers.randomBytes(20))); - await merkleTree.updateAddress(key, ethers.toBeHex(value, 20)); + await merkleTree.updateAddress(key, toBeHex(value, 20)); await localMerkleTree.update(BigInt(key), BigInt(value)); expect(await merkleTree.getAddressRoot()).to.equal(await getRoot(localMerkleTree)); diff --git a/test/libs/data-structures/memory/Vector.test.ts b/test/libs/data-structures/memory/Vector.test.ts index 6c474356..c849f598 100644 --- a/test/libs/data-structures/memory/Vector.test.ts +++ b/test/libs/data-structures/memory/Vector.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { VectorMock } from "@ethers-v6"; @@ -40,9 +41,9 @@ describe("Vector", () => { }); it("should test empty vector", async () => { - await expect(vector.testEmptyPop()).to.be.revertedWith("Vector: empty vector"); - await expect(vector.testEmptySet()).to.be.revertedWith("Vector: out of bounds"); - await expect(vector.testEmptyAt()).to.be.revertedWith("Vector: out of bounds"); + await expect(vector.testEmptyPop()).to.be.revertedWithCustomError(vector, "PopEmptyVector").withArgs(); + await expect(vector.testEmptySet()).to.be.revertedWithCustomError(vector, "IndexOutOfBounds").withArgs(1, 0); + await expect(vector.testEmptyAt()).to.be.revertedWithCustomError(vector, "IndexOutOfBounds").withArgs(0, 0); }); }); diff --git a/test/libs/utils/DecimalsConverter.test.ts b/test/libs/utils/DecimalsConverter.test.ts index e474217a..45aab9f3 100644 --- a/test/libs/utils/DecimalsConverter.test.ts +++ b/test/libs/utils/DecimalsConverter.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { wei } from "@/scripts/utils/utils"; @@ -95,7 +96,9 @@ describe("DecimalsConverter", () => { }); it("should get exception if the result of conversion is zero", async () => { - await expect(mock.to18Safe(wei("1", 11), 30)).to.be.revertedWith("DecimalsConverter: conversion failed"); + await expect(mock.to18Safe(wei("1", 11), 30)) + .to.be.revertedWithCustomError(mock, "ConversionFailed") + .withArgs(); }); }); @@ -142,7 +145,9 @@ describe("DecimalsConverter", () => { }); it("should get exception if the result of conversion is zero", async () => { - await expect(mock.from18Safe(wei("1", 6), 6)).to.be.revertedWith("DecimalsConverter: conversion failed"); + await expect(mock.from18Safe(wei("1", 6), 6)) + .to.be.revertedWithCustomError(mock, "ConversionFailed") + .withArgs(); }); }); @@ -180,7 +185,9 @@ describe("DecimalsConverter", () => { }); it("should get exception if the result of conversion is zero", async () => { - await expect(mock.round18Safe(wei("1", 6), 6)).to.be.revertedWith("DecimalsConverter: conversion failed"); + await expect(mock.round18Safe(wei("1", 6), 6)) + .to.be.revertedWithCustomError(mock, "ConversionFailed") + .withArgs(); }); }); }); diff --git a/test/libs/utils/ReturnDataProxy.test.ts b/test/libs/utils/ReturnDataProxy.test.ts index f33ea84f..cf5c1ad1 100644 --- a/test/libs/utils/ReturnDataProxy.test.ts +++ b/test/libs/utils/ReturnDataProxy.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { wei } from "@/scripts/utils/utils"; @@ -38,7 +39,7 @@ describe("ReturnDataProxy", () => { }); it("should revert with message", async () => { - await expect(proxyMock.callRevertWithMessage()).to.be.revertedWith("test"); + await expect(proxyMock.callRevertWithMessage()).to.be.revertedWithCustomError(rawMock, "Test").withArgs(); }); }); @@ -51,7 +52,7 @@ describe("ReturnDataProxy", () => { }); it("should return revert message", async () => { - await expect(proxyMock.staticCallRevertWithMessage()).to.be.revertedWith("test"); + await expect(proxyMock.staticCallRevertWithMessage()).to.be.revertedWithCustomError(rawMock, "Test").withArgs(); }); it("should return value with passed arguments", async () => { @@ -73,7 +74,7 @@ describe("ReturnDataProxy", () => { }); it("should revert with message", async () => { - await expect(proxyMock.delegateCallRevertWithMessage()).to.be.revertedWith("test"); + await expect(proxyMock.delegateCallRevertWithMessage()).to.be.revertedWithCustomError(rawMock, "Test").withArgs(); }); }); }); diff --git a/test/libs/utils/TypeCaster.test.ts b/test/libs/utils/TypeCaster.test.ts index efbadc1d..536fa770 100644 --- a/test/libs/utils/TypeCaster.test.ts +++ b/test/libs/utils/TypeCaster.test.ts @@ -1,7 +1,8 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR, ETHER_ADDR, ZERO_BYTES32 } from "@/scripts/utils/constants"; +import { ETHER_ADDR } from "@/scripts/utils/constants"; import { TypeCasterMock } from "@ethers-v6"; @@ -21,7 +22,7 @@ describe("TypeCaster", () => { afterEach(reverter.revert); describe("array cast", () => { - const addressArrays = [[], [ZERO_ADDR, ETHER_ADDR]]; + const addressArrays = [[], [ethers.ZeroAddress, ETHER_ADDR]]; const bytes32Arrays = [[], addressArrays[1].flatMap((e) => coder.encode(["address"], [e]))]; const uint256Arrays = [[], (bytes32Arrays[1].flatMap((e) => coder.decode(["uint256"], e)))]; @@ -69,7 +70,7 @@ describe("TypeCaster", () => { }); describe("singleton array", () => { - const MOCKED_BYTES32 = ZERO_BYTES32.replaceAll("0000", "1234"); + const MOCKED_BYTES32 = ethers.ZeroHash.replaceAll("0000", "1234"); it("should build singleton arrays properly", async () => { expect(await mock.asSingletonArrayFromUint256(123)).to.deep.equal([123n]); diff --git a/test/libs/zkp/VerifierHelper.test.ts b/test/libs/zkp/VerifierHelper.test.ts index 7c2cdbf4..b140efee 100644 --- a/test/libs/zkp/VerifierHelper.test.ts +++ b/test/libs/zkp/VerifierHelper.test.ts @@ -1,5 +1,6 @@ import { ethers } from "hardhat"; import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { VerifierHelperMock, Verifier2Mock, Verifier3Mock } from "@ethers-v6"; @@ -54,12 +55,12 @@ describe("VerifierHelper", () => { it("should get exception if failed to call verifyProof function", async () => { const wrongPubSignals = [1, 1, 2, 3]; - await expect( - verifierHelper.verifyProofStruct(await verifier2.getAddress(), wrongPubSignals, { a, b, c }), - ).to.be.revertedWith("VerifierHelper: failed to call verifyProof function"); - await expect( - verifierHelper.verifyProof(await verifier3.getAddress(), wrongPubSignals, a, b, c), - ).to.be.revertedWith("VerifierHelper: failed to call verifyProof function"); + await expect(verifierHelper.verifyProofStruct(await verifier2.getAddress(), wrongPubSignals, { a, b, c })) + .to.be.revertedWithCustomError(verifierHelper, "FailedToCallVerifyProof") + .withArgs(); + await expect(verifierHelper.verifyProof(await verifier3.getAddress(), wrongPubSignals, a, b, c)) + .to.be.revertedWithCustomError(verifierHelper, "FailedToCallVerifyProof") + .withArgs(); }); }); @@ -77,12 +78,13 @@ describe("VerifierHelper", () => { }); it("should get an exception if it passes invalid public signals arr", async () => { - await expect( - verifierHelper.verifyProofStructSafe(await verifier2.getAddress(), pubSignals2, { a, b, c }, 4), - ).to.be.revertedWith("VerifierHelper: invalid public signals count"); - await expect( - verifierHelper.verifyProofSafe(await verifier3.getAddress(), pubSignals3, a, b, c, 4), - ).to.be.revertedWith("VerifierHelper: invalid public signals count"); + await expect(verifierHelper.verifyProofStructSafe(await verifier2.getAddress(), pubSignals2, { a, b, c }, 4)) + .to.be.revertedWithCustomError(verifierHelper, "InvalidPublicSignalsCount") + .withArgs(pubSignals2.length, 4); + + await expect(verifierHelper.verifyProofSafe(await verifier3.getAddress(), pubSignals3, a, b, c, 4)) + .to.be.revertedWithCustomError(verifierHelper, "InvalidPublicSignalsCount") + .withArgs(pubSignals3.length, 4); }); }); }); diff --git a/test/oracles/UniswapV2Oracle.test.ts b/test/oracles/UniswapV2Oracle.test.ts index f9682953..4442b498 100644 --- a/test/oracles/UniswapV2Oracle.test.ts +++ b/test/oracles/UniswapV2Oracle.test.ts @@ -1,6 +1,7 @@ import { ethers } from "hardhat"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; +import { time } from "@nomicfoundation/hardhat-network-helpers"; + import { wei } from "@/scripts/utils/utils"; import { Reverter } from "@/test/helpers/reverter"; @@ -52,12 +53,13 @@ describe("UniswapV2Oracle", () => { }); it("should not initialize twice", async () => { - await expect(oracle.mockInit(await uniswapV2Factory.getAddress(), ORACLE_TIME_WINDOW)).to.be.revertedWith( - "Initializable: contract is not initializing", - ); - await expect( - oracle.__OracleV2Mock_init(await uniswapV2Factory.getAddress(), ORACLE_TIME_WINDOW), - ).to.be.revertedWith("Initializable: contract is already initialized"); + await expect(oracle.mockInit(await uniswapV2Factory.getAddress(), ORACLE_TIME_WINDOW)) + .to.be.revertedWithCustomError(oracle, "NotInitializing") + .withArgs(); + + await expect(oracle.__OracleV2Mock_init(await uniswapV2Factory.getAddress(), ORACLE_TIME_WINDOW)) + .to.be.revertedWithCustomError(oracle, "InvalidInitialization") + .withArgs(); }); }); @@ -69,7 +71,7 @@ describe("UniswapV2Oracle", () => { }); it("shouldn't set 0 timewindow", async () => { - await expect(oracle.setTimeWindow(0)).to.be.revertedWith("UniswapV2Oracle: time window can't be 0"); + await expect(oracle.setTimeWindow(0)).to.be.revertedWithCustomError(oracle, "TimeWindowIsZero").withArgs(); }); it("should add paths correctly", async () => { @@ -84,19 +86,23 @@ describe("UniswapV2Oracle", () => { }); it("should not allow to set path with length < 2", async () => { - await expect(oracle.addPaths([[C_TOKEN]])).to.be.revertedWith("UniswapV2Oracle: path must be longer than 2"); + await expect(oracle.addPaths([[C_TOKEN]])) + .to.be.revertedWithCustomError(oracle, "InvalidPath") + .withArgs(C_TOKEN, 1); }); it("should not allow to set path with non-existent pairs", async () => { - await expect(oracle.addPaths([A_C_PATH])).to.be.revertedWith("UniswapV2Oracle: uniswap pair doesn't exist"); + await expect(oracle.addPaths([A_C_PATH])) + .to.be.revertedWithCustomError(oracle, "PairDoesNotExist") + .withArgs(A_TOKEN, C_TOKEN); }); it("should not add same path twice", async () => { await createPairs(); - await expect(oracle.addPaths([A_C_PATH, A_C_PATH])).to.be.revertedWith( - "UniswapV2Oracle: path already registered", - ); + await expect(oracle.addPaths([A_C_PATH, A_C_PATH])) + .to.be.revertedWithCustomError(oracle, "PathAlreadyRegistered") + .withArgs(A_TOKEN); }); }); @@ -208,7 +214,9 @@ describe("UniswapV2Oracle", () => { }); it("should not get price if there is no path", async () => { - await expect(oracle.getPrice(A_TOKEN, 10)).to.be.revertedWith("UniswapV2Oracle: invalid path"); + await expect(oracle.getPrice(A_TOKEN, 10)) + .to.be.revertedWithCustomError(oracle, "InvalidPath") + .withArgs(A_TOKEN, 0); }); }); }); diff --git a/test/oracles/UniswapV3Oracle.test.ts b/test/oracles/UniswapV3Oracle.test.ts index 86b494f9..42097b28 100644 --- a/test/oracles/UniswapV3Oracle.test.ts +++ b/test/oracles/UniswapV3Oracle.test.ts @@ -1,8 +1,10 @@ import { ethers } from "hardhat"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; + +import { time } from "@nomicfoundation/hardhat-network-helpers"; import { BigNumberish } from "ethers"; import { BigNumber } from "bignumber.js"; + import { wei } from "@/scripts/utils/utils"; import { Reverter } from "@/test/helpers/reverter"; diff --git a/test/proxy/beacon/ProxyBeacon.test.ts b/test/proxy/beacon/ProxyBeacon.test.ts index a1e260ab..addf8f8b 100644 --- a/test/proxy/beacon/ProxyBeacon.test.ts +++ b/test/proxy/beacon/ProxyBeacon.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { ProxyBeacon, ERC20Mock } from "@ethers-v6"; @@ -31,7 +32,7 @@ describe("ProxyBeacon", () => { describe("functions", () => { it("should upgrade", async () => { - expect(await proxyBeacon.implementation()).to.equal(ZERO_ADDR); + expect(await proxyBeacon.implementation()).to.equal(ethers.ZeroAddress); await proxyBeacon.upgradeTo(await token.getAddress()); @@ -39,13 +40,15 @@ describe("ProxyBeacon", () => { }); it("should not upgrade to non-contract", async () => { - await expect(proxyBeacon.upgradeTo(SECOND)).to.be.revertedWith("ProxyBeacon: not a contract"); + await expect(proxyBeacon.upgradeTo(SECOND)) + .to.be.revertedWithCustomError(proxyBeacon, "NewImplementationNotAContract") + .withArgs(SECOND); }); it("only owner should upgrade", async () => { - await expect(proxyBeacon.connect(SECOND).upgradeTo(await token.getAddress())).to.be.revertedWith( - "PermanentOwnable: caller is not the owner", - ); + await expect(proxyBeacon.connect(SECOND).upgradeTo(await token.getAddress())) + .to.be.revertedWithCustomError(proxyBeacon, "UnauthorizedAccount") + .withArgs(SECOND); }); }); }); diff --git a/test/proxy/beacon/PublicBeaconProxy.test.ts b/test/proxy/beacon/PublicBeaconProxy.test.ts index 33f263ce..701197df 100644 --- a/test/proxy/beacon/PublicBeaconProxy.test.ts +++ b/test/proxy/beacon/PublicBeaconProxy.test.ts @@ -1,6 +1,7 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; import { PublicBeaconProxy, ProxyBeacon, ERC20Mock } from "@ethers-v6"; diff --git a/test/proxy/transparent/AdminableProxy.test.ts b/test/proxy/transparent/AdminableProxy.test.ts new file mode 100644 index 00000000..e3112ce0 --- /dev/null +++ b/test/proxy/transparent/AdminableProxy.test.ts @@ -0,0 +1,58 @@ +import { ethers } from "hardhat"; +import { expect } from "chai"; + +import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network-helpers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + +import { Reverter } from "@/test/helpers/reverter"; + +import { AdminableProxyUpgrader, AdminableProxy, ERC20Mock } from "@ethers-v6"; + +describe("AdminableProxy", () => { + const reverter = new Reverter(); + + let OWNER: SignerWithAddress; + let PROXY_UPGRADER: SignerWithAddress; + + let proxy: AdminableProxy; + let tokenProxy: ERC20Mock; + + before("setup", async () => { + [OWNER] = await ethers.getSigners(); + + const ERC20Mock = await ethers.getContractFactory("ERC20Mock"); + const AdminableProxyUpgrader = await ethers.getContractFactory("AdminableProxyUpgrader"); + const AdminableProxy = await ethers.getContractFactory("AdminableProxy"); + + const token: ERC20Mock = await ERC20Mock.deploy("mock", "mock", 18); + + const adminableProxyUpgrader: AdminableProxyUpgrader = await AdminableProxyUpgrader.deploy(); + proxy = await AdminableProxy.deploy(await token.getAddress(), await adminableProxyUpgrader.getAddress(), "0x"); + + tokenProxy = token.attach(await proxy.getAddress()); + + await impersonateAccount(await adminableProxyUpgrader.getAddress()); + PROXY_UPGRADER = await ethers.provider.getSigner(await adminableProxyUpgrader.getAddress()); + await setBalance(await PROXY_UPGRADER.getAddress(), ethers.parseEther("1")); + + await reverter.snapshot(); + }); + + afterEach(reverter.revert); + + describe("delegated functions", () => { + const AMOUNT = 10; + + it("proxy admin cannot call delegated functions", async () => { + await expect(tokenProxy.connect(PROXY_UPGRADER).mint(OWNER.address, AMOUNT)) + .to.be.revertedWithCustomError(proxy, "ProxyDeniedAdminAccess") + .withArgs(); + }); + + it("everyone except proxy admin can call delegated functions", async () => { + await tokenProxy.mint(OWNER.address, AMOUNT); + + expect(await tokenProxy.balanceOf(OWNER.address)).to.equal(AMOUNT); + }); + }); +}); diff --git a/test/proxy/transparent/AdminableProxyUpgrader.test.ts b/test/proxy/transparent/AdminableProxyUpgrader.test.ts new file mode 100644 index 00000000..9d5e98e1 --- /dev/null +++ b/test/proxy/transparent/AdminableProxyUpgrader.test.ts @@ -0,0 +1,53 @@ +import { ethers } from "hardhat"; +import { expect } from "chai"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + +import { Reverter } from "@/test/helpers/reverter"; + +import { AdminableProxyUpgrader, AdminableProxy, ERC20Mock } from "@ethers-v6"; + +describe("AdminableProxyUpgrader", () => { + const reverter = new Reverter(); + + let OWNER: SignerWithAddress; + let SECOND: SignerWithAddress; + + let adminableProxyUpgrader: AdminableProxyUpgrader; + let token: ERC20Mock; + let proxy: AdminableProxy; + + before("setup", async () => { + [OWNER, SECOND] = await ethers.getSigners(); + + const ERC20Mock = await ethers.getContractFactory("ERC20Mock"); + const AdminableProxyUpgrader = await ethers.getContractFactory("AdminableProxyUpgrader"); + const AdminableProxy = await ethers.getContractFactory("AdminableProxy"); + + token = await ERC20Mock.deploy("mock", "mock", 18); + + adminableProxyUpgrader = await AdminableProxyUpgrader.deploy(); + proxy = await AdminableProxy.deploy(await token.getAddress(), await adminableProxyUpgrader.getAddress(), "0x"); + + await reverter.snapshot(); + }); + + afterEach(reverter.revert); + + describe("upgrade", () => { + it("only owner should upgrade", async () => { + await expect( + adminableProxyUpgrader.connect(SECOND).upgrade(await proxy.getAddress(), await proxy.getAddress(), "0x"), + ) + .to.be.revertedWithCustomError(adminableProxyUpgrader, "UnauthorizedAccount") + .withArgs(SECOND); + }); + }); + + describe("getImplementation", () => { + it("should get implementation", async () => { + expect(await adminableProxyUpgrader.getImplementation(await proxy.getAddress())).to.equal( + await token.getAddress(), + ); + }); + }); +}); diff --git a/test/proxy/transparent/TransparentProxyUpgrader.test.ts b/test/proxy/transparent/TransparentProxyUpgrader.test.ts deleted file mode 100644 index 6b021e42..00000000 --- a/test/proxy/transparent/TransparentProxyUpgrader.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { expect } from "chai"; -import { Reverter } from "@/test/helpers/reverter"; - -import { TransparentProxyUpgrader, TransparentUpgradeableProxy, ERC20Mock } from "@ethers-v6"; - -describe("TransparentProxyUpgrader", () => { - const reverter = new Reverter(); - - let OWNER: SignerWithAddress; - let SECOND: SignerWithAddress; - - let transparentProxyUpgrader: TransparentProxyUpgrader; - let token: ERC20Mock; - let proxy: TransparentUpgradeableProxy; - - before("setup", async () => { - [OWNER, SECOND] = await ethers.getSigners(); - - const ERC20Mock = await ethers.getContractFactory("ERC20Mock"); - const TransparentProxyUpgrader = await ethers.getContractFactory("TransparentProxyUpgrader"); - const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy"); - - token = await ERC20Mock.deploy("mock", "mock", 18); - - transparentProxyUpgrader = await TransparentProxyUpgrader.deploy(); - proxy = await TransparentUpgradeableProxy.deploy( - await token.getAddress(), - await transparentProxyUpgrader.getAddress(), - "0x", - ); - - await reverter.snapshot(); - }); - - afterEach(reverter.revert); - - describe("upgrade", () => { - it("only owner should upgrade", async () => { - await expect( - transparentProxyUpgrader.connect(SECOND).upgrade(await proxy.getAddress(), await proxy.getAddress(), "0x"), - ).to.be.revertedWith("PermanentOwnable: caller is not the owner"); - }); - }); - - describe("getImplementation", () => { - it("should get implementation", async () => { - expect(await transparentProxyUpgrader.getImplementation(await proxy.getAddress())).to.equal( - await token.getAddress(), - ); - }); - - it("should not get implementation", async () => { - await expect(transparentProxyUpgrader.getImplementation(await token.getAddress())).to.be.revertedWith( - "TransparentProxyUpgrader: not a proxy", - ); - }); - }); -}); diff --git a/test/token/SBT.test.ts b/test/token/SBT.test.ts index 8dd3a71a..eb6a392d 100644 --- a/test/token/SBT.test.ts +++ b/test/token/SBT.test.ts @@ -1,8 +1,9 @@ import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; + +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; + import { Reverter } from "@/test/helpers/reverter"; -import { ZERO_ADDR } from "@/scripts/utils/constants"; import { SBTMock } from "@ethers-v6"; @@ -31,10 +32,10 @@ describe("SBT", () => { describe("access", () => { it("should not initialize twice", async () => { - await expect(sbt.__SBTMock_init(name, symbol)).to.be.revertedWith( - "Initializable: contract is already initialized", - ); - await expect(sbt.mockInit(name, symbol)).to.be.revertedWith("Initializable: contract is not initializing"); + await expect(sbt.__SBTMock_init(name, symbol)) + .to.be.revertedWithCustomError(sbt, "InvalidInitialization") + .withArgs(); + await expect(sbt.mockInit(name, symbol)).to.be.revertedWithCustomError(sbt, "NotInitializing").withArgs(); }); }); @@ -59,17 +60,19 @@ describe("SBT", () => { expect(await sbt.tokenURI(1337)).to.equal(""); - expect(tx).to.emit(sbt, "Transfer").withArgs(ZERO_ADDR, FIRST.address, 1337); + expect(tx).to.emit(sbt, "Transfer").withArgs(ethers.ZeroAddress, FIRST.address, 1337); }); it("should not mint to null address", async () => { - await expect(sbt.mint(ZERO_ADDR, 1)).to.be.revertedWith("SBT: address(0) receiver"); + await expect(sbt.mint(ethers.ZeroAddress, 1)) + .to.be.revertedWithCustomError(sbt, "ReceiverIsZeroAddress") + .withArgs(); }); it("should not mint token twice", async () => { await sbt.mint(FIRST.address, 1); - await expect(sbt.mint(FIRST.address, 1)).to.be.revertedWith("SBT: token already exists"); + await expect(sbt.mint(FIRST.address, 1)).to.be.revertedWithCustomError(sbt, "TokenAlreadyExists").withArgs(1); }); }); @@ -82,15 +85,15 @@ describe("SBT", () => { expect(await sbt.tokenExists(0)).to.be.false; expect(await sbt.balanceOf(FIRST.address)).to.equal(0n); - expect(await sbt.ownerOf(0)).to.equal(ZERO_ADDR); + expect(await sbt.ownerOf(0)).to.equal(ethers.ZeroAddress); expect(await sbt.tokensOf(FIRST.address)).to.deep.equal([]); - expect(tx).to.emit(sbt, "Transfer").withArgs(FIRST.address, ZERO_ADDR, 1337); + expect(tx).to.emit(sbt, "Transfer").withArgs(FIRST.address, ethers.ZeroAddress, 1337); }); it("should not burn SBT that doesn't exist", async () => { - await expect(sbt.burn(1337)).to.be.revertedWith("SBT: token doesn't exist"); + await expect(sbt.burn(1337)).to.be.revertedWithCustomError(sbt, "TokenDoesNotExist").withArgs(1337); }); }); @@ -103,7 +106,7 @@ describe("SBT", () => { }); it("should not set uri for non-existent token", async () => { - await expect(sbt.setTokenURI(1337, "")).to.be.revertedWith("SBT: token doesn't exist"); + await expect(sbt.setTokenURI(1337, "")).to.be.revertedWithCustomError(sbt, "TokenDoesNotExist").withArgs(1337); }); it("should reset token URI if token is burnder", async () => { diff --git a/test/utils/BlockGuard.test.ts b/test/utils/BlockGuard.test.ts index 380c79f7..8905913c 100644 --- a/test/utils/BlockGuard.test.ts +++ b/test/utils/BlockGuard.test.ts @@ -1,7 +1,9 @@ import { ethers } from "hardhat"; +import { expect } from "chai"; + import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; + import { Reverter } from "@/test/helpers/reverter"; import { BlockGuardMock } from "@ethers-v6"; @@ -51,7 +53,9 @@ describe("BlockGuard", () => { it("should disallow to call in the same block", async () => { await expect( mock.multicall([mock.interface.encodeFunctionData("deposit"), mock.interface.encodeFunctionData("withdraw")]), - ).to.be.revertedWith("BlockGuard: locked"); + ) + .to.be.revertedWithCustomError(mock, "BlockGuardLocked") + .withArgs(await mock.DEPOSIT_WITHDRAW_RESOURCE(), FIRST); }); }); @@ -71,7 +75,9 @@ describe("BlockGuard", () => { it("should disallow to call in the same block", async () => { await expect( mock.multicall([mock.interface.encodeFunctionData("lock"), mock.interface.encodeFunctionData("lock")]), - ).to.be.revertedWith("BlockGuard: locked"); + ) + .to.be.revertedWithCustomError(mock, "BlockGuardLocked") + .withArgs(await mock.LOCK_LOCK_RESOURCE(), FIRST); }); }); });