diff --git a/.github/workflows/solidity-ci.yml b/.github/workflows/solidity-ci.yml index af5089026..bea913ae1 100644 --- a/.github/workflows/solidity-ci.yml +++ b/.github/workflows/solidity-ci.yml @@ -76,6 +76,9 @@ jobs: - name: Compile run: pnpm run compile + - name: Compile modularized + run: pnpm run compile:modularized + test: runs-on: ubuntu-latest needs: [compile] diff --git a/contracts-modularized/EIP712/EIP712Upgradeable.sol b/contracts-modularized/EIP712/EIP712Upgradeable.sol new file mode 100644 index 000000000..fd6b64f51 --- /dev/null +++ b/contracts-modularized/EIP712/EIP712Upgradeable.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"; +import "../utils/Initializable.sol"; + +/** + * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. + * + * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, + * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding + * they need in their contracts using a combination of `abi.encode` and `keccak256`. + * + * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding + * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA + * ({_hashTypedDataV4}). + * + * The implementation of the domain separator was designed to be as efficient as possible while still properly updating + * the chain id to protect against replay attacks on an eventual fork of the chain. + * + * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method + * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. + * + * _Available since v3.4._ + * + * @custom:storage-size 52 + */ + +bytes32 constant EIP712_POSITION = keccak256("diamond.eip712.storage"); + +struct EIP712Struct { + bytes32 _HASHED_NAME; + bytes32 _HASHED_VERSION; +} + +function eip712ds() pure returns (EIP712Struct storage eip712Struct) { + bytes32 position = EIP712_POSITION; + assembly { + eip712Struct.slot := position + } +} + +abstract contract EIP712Upgradeable is Initializable { + /* solhint-disable var-name-mixedcase */ + bytes32 private constant _TYPE_HASH = + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ); + + /* solhint-enable var-name-mixedcase */ + + /** + * @dev Initializes the domain separator and parameter caches. + * + * The meaning of `name` and `version` is specified in + * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: + * + * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. + * - `version`: the current major version of the signing domain. + * + * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart + * contract upgrade]. + */ + function __EIP712_init( + string memory name, + string memory version + ) internal onlyInitializing { + __EIP712_init_unchained(name, version); + } + + function __EIP712_init_unchained( + string memory name, + string memory version + ) internal onlyInitializing { + bytes32 hashedName = keccak256(bytes(name)); + bytes32 hashedVersion = keccak256(bytes(version)); + eip712ds()._HASHED_NAME = hashedName; + eip712ds()._HASHED_VERSION = hashedVersion; + } + + /** + * @dev Returns the domain separator for the current chain. + */ + function _domainSeparatorV4() internal view returns (bytes32) { + return + _buildDomainSeparator( + _TYPE_HASH, + _EIP712NameHash(), + _EIP712VersionHash() + ); + } + + function _buildDomainSeparator( + bytes32 typeHash, + bytes32 nameHash, + bytes32 versionHash + ) private view returns (bytes32) { + return + keccak256( + abi.encode( + typeHash, + nameHash, + versionHash, + block.chainid, + address(this) + ) + ); + } + + /** + * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this + * function returns the hash of the fully encoded EIP712 message for this domain. + * + * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: + * + * ```solidity + * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( + * keccak256("Mail(address to,string contents)"), + * mailTo, + * keccak256(bytes(mailContents)) + * ))); + * address signer = ECDSA.recover(digest, signature); + * ``` + */ + function _hashTypedDataV4( + bytes32 structHash + ) internal view virtual returns (bytes32) { + return + ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); + } + + /** + * @dev The hash of the name parameter for the EIP712 domain. + * + * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs + * are a concern. + */ + function _EIP712NameHash() internal view virtual returns (bytes32) { + return eip712ds()._HASHED_NAME; + } + + /** + * @dev The hash of the version parameter for the EIP712 domain. + * + * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs + * are a concern. + */ + function _EIP712VersionHash() internal view virtual returns (bytes32) { + return eip712ds()._HASHED_VERSION; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[50] private __gap; +} diff --git a/contracts-modularized/ERC165/ERC165UpgradeableDS.sol b/contracts-modularized/ERC165/ERC165UpgradeableDS.sol new file mode 100644 index 000000000..6d9288208 --- /dev/null +++ b/contracts-modularized/ERC165/ERC165UpgradeableDS.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) + +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; +import "../utils/Initializable.sol"; + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + * + * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. + */ +abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface( + bytes4 interfaceId + ) public view virtual override returns (bool) { + return interfaceId == type(IERC165Upgradeable).interfaceId; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[50] private __gap; +} diff --git a/contracts-modularized/ERC173/ERC173Upgradeable.sol b/contracts-modularized/ERC173/ERC173Upgradeable.sol new file mode 100644 index 000000000..df415e17a --- /dev/null +++ b/contracts-modularized/ERC173/ERC173Upgradeable.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {LibDiamond} from "../diamond/libraries/LibDiamond.sol"; +import {IERC173} from "./interfaces/IERC173.sol"; + +contract ERC173Upgradeable is IERC173 { + function transferOwnership(address _newOwner) public override { + LibDiamond.enforceIsContractOwner(); + LibDiamond.setContractOwner(_newOwner); + } + + function owner() public view override returns (address owner_) { + owner_ = LibDiamond.contractOwner(); + } +} diff --git a/contracts-modularized/ERC173/interfaces/IERC173.sol b/contracts-modularized/ERC173/interfaces/IERC173.sol new file mode 100644 index 000000000..90b73cc02 --- /dev/null +++ b/contracts-modularized/ERC173/interfaces/IERC173.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title ERC-173 Contract Ownership Standard +/// Note: the ERC-165 identifier for this interface is 0x7f5828d0 +/* is ERC165 */ +interface IERC173 { + /// @dev This emits when ownership of a contract changes. + event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner + ); + + /// @notice Get the address of the owner + /// @return owner_ The address of the owner. + function owner() external view returns (address owner_); + + /// @notice Set the address of the new owner of the contract + /// @dev Set _newOwner to address(0) to renounce any ownership. + /// @param _newOwner The address of the new owner of the contract + function transferOwnership(address _newOwner) external; +} diff --git a/contracts-modularized/ERC3525/ERC3525Core.sol b/contracts-modularized/ERC3525/ERC3525Core.sol new file mode 100644 index 000000000..a0f873954 --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525Core.sol @@ -0,0 +1,320 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; + +import "../ERC721/ERC721EnumerableUpgradeable.sol"; +import "../ERC721/ERC721EnumerableCore.sol"; +import "./interfaces/IERC3525Upgradeable.sol"; +import "./interfaces/IERC3525MetadataUpgradeable.sol"; +import "./ERC3525Storage.sol"; +import "../ERC721/ERC721Storage.sol"; + +contract ERC3525Core is ERC721EnumerableCore { + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + /** + * @dev MUST emit when value of a token is transferred to another token with the same slot, + * including zero value transfers (_value == 0) as well as transfers when tokens are created + * (`_fromTokenId` == 0) or destroyed (`_toTokenId` == 0). + * @param _fromTokenId The token id to transfer value from + * @param _toTokenId The token id to transfer value to + * @param _value The transferred value + */ + event TransferValue( + uint256 indexed _fromTokenId, + uint256 indexed _toTokenId, + uint256 _value + ); + + /** + * @dev MUST emits when the approval value of a token is set or changed. + * @param _tokenId The token to approve + * @param _operator The operator to approve for + * @param _value The maximum value that `_operator` is allowed to manage + */ + event ApprovalValue( + uint256 indexed _tokenId, + address indexed _operator, + uint256 _value + ); + + /** + * @dev MUST emit when the slot of a token is set or changed. + * @param _tokenId The token of which slot is set or changed + * @param _oldSlot The previous slot of the token + * @param _newSlot The updated slot of the token + */ + event SlotChanged( + uint256 indexed _tokenId, + uint256 indexed _oldSlot, + uint256 indexed _newSlot + ); + + function valueDecimals() internal view returns (uint8) { + return LibERC3525Storage.s()._decimals; + } + + function balanceOf(uint256 tokenId) internal view returns (uint256) { + _requireMinted(tokenId); + + return LibERC3525Storage.s()._values[tokenId]; + } + + function slotOf(uint256 tokenId) internal view returns (uint256) { + _requireMinted(tokenId); + + return LibERC3525Storage.s()._slots[tokenId]; + } + + function contractURI() internal view virtual returns (string memory) { + string memory baseURI = _baseURI(); + return + bytes(baseURI).length > 0 + ? string(abi.encodePacked(baseURI, address(this).toHexString())) + : ""; + } + + function slotURI( + uint256 slot + ) internal view virtual returns (string memory) { + string memory contractUri = contractURI(); + return + bytes(contractUri).length > 0 + ? string( + abi.encodePacked(contractUri, "/slots/", slot.toString()) + ) + : ""; + } + + function tokenURI( + uint256 tokenId + ) internal view virtual override(ERC721Core) returns (string memory) { + _requireMinted(tokenId); + + string memory _tokenURI = LibERC721Storage.s()._tokenURIs[tokenId]; + if (bytes(_tokenURI).length > 0) { + return _tokenURI; + } + + string memory contractUri = contractURI(); + return + bytes(contractUri).length > 0 + ? string( + abi.encodePacked( + contractUri, + "/tokens/", + tokenId.toString() + ) + ) + : ""; + } + + function approve( + uint256 tokenId, + address to, + uint256 value + ) internal virtual { + approve(to, tokenId); + + if (!ERC721Core._isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + + _approve(tokenId, to, value); + } + + function allowance( + uint256 tokenId, + address operator + ) internal view virtual returns (uint256) { + return LibERC3525Storage.s()._valueApprovals[tokenId].get(operator); + } + + function transferFrom( + uint256 fromTokenId, + address to, + uint256 value + ) internal virtual returns (uint256) { + _spendAllowance(_msgSender(), fromTokenId, value); + + uint256 newTokenId = _getNewTokenId(fromTokenId); + _mint(to, newTokenId, LibERC3525Storage.s()._slots[fromTokenId]); + _transfer(fromTokenId, newTokenId, value); + + return newTokenId; + } + + function transferFrom( + uint256 fromTokenId, + uint256 toTokenId, + uint256 value + ) internal virtual { + _spendAllowance(_msgSender(), fromTokenId, value); + + if ( + LibERC3525Storage.s()._slots[fromTokenId] != + LibERC3525Storage.s()._slots[toTokenId] + ) + revert Mismatch( + LibERC3525Storage.s()._slots[fromTokenId], + LibERC3525Storage.s()._slots[toTokenId] + ); + + _transfer(fromTokenId, toTokenId, value); + } + + function _mint(address to, uint256 tokenId, uint256 slot) internal virtual { + if (tokenId == 0 || slot == 0) revert NullValue(); + + ERC721Core._mint(to, tokenId); + LibERC3525Storage.s()._slots[tokenId] = slot; + + emit SlotChanged(tokenId, 0, slot); + } + + function _mint(uint256 tokenId, uint256 value) internal virtual { + _requireMinted(tokenId); + + address owner = ownerOf(tokenId); + uint256 slot = slotOf(tokenId); + + _beforeValueTransfer(address(0), owner, 0, tokenId, slot, value); + + LibERC3525Storage.s()._values[tokenId] = value; + emit TransferValue(0, tokenId, value); + + _afterValueTransfer(address(0), owner, 0, tokenId, slot, value); + } + + function _burn(uint256 tokenId) internal virtual override { + address owner = ERC721Core.ownerOf(tokenId); + ERC721Core._burn(tokenId); + + uint256 slot = LibERC3525Storage.s()._slots[tokenId]; + uint256 value = LibERC3525Storage.s()._values[tokenId]; + + _beforeValueTransfer(owner, address(0), tokenId, 0, slot, value); + + delete LibERC3525Storage.s()._slots[tokenId]; + delete LibERC3525Storage.s()._values[tokenId]; + + _afterValueTransfer(owner, address(0), tokenId, 0, slot, value); + + emit TransferValue(tokenId, 0, value); + emit SlotChanged(tokenId, slot, 0); + } + + function _burn(uint256 tokenId, uint256 value) internal virtual { + address owner = ERC721Core.ownerOf(tokenId); + uint256 slot = LibERC3525Storage.s()._slots[tokenId]; + + if (LibERC3525Storage.s()._values[tokenId] < value) + revert InsufficientBalance( + LibERC3525Storage.s()._values[tokenId], + value + ); + + _beforeValueTransfer(owner, address(0), tokenId, 0, slot, value); + + delete LibERC3525Storage.s()._valueApprovals[tokenId]; + + LibERC3525Storage.s()._values[tokenId] -= value; + + _afterValueTransfer(owner, address(0), tokenId, 0, slot, value); + + emit TransferValue(tokenId, 0, value); + } + + function _transfer( + uint256 fromTokenId, + uint256 toTokenId, + uint256 value + ) internal virtual { + address from = ERC721Core.ownerOf(fromTokenId); + address to = ERC721Core.ownerOf(toTokenId); + uint256 slot = LibERC3525Storage.s()._slots[fromTokenId]; + + _beforeValueTransfer(from, to, fromTokenId, toTokenId, slot, value); + + delete LibERC3525Storage.s()._valueApprovals[fromTokenId]; + + LibERC3525Storage.s()._values[fromTokenId] -= value; + LibERC3525Storage.s()._values[toTokenId] += value; + + _afterValueTransfer(from, to, fromTokenId, toTokenId, slot, value); + + emit TransferValue(fromTokenId, toTokenId, value); + } + + function _spendAllowance( + address operator, + uint256 tokenId, + uint256 value + ) internal virtual { + if (ownerOf(tokenId) == operator) return; + uint256 currentAllowance = ERC3525Core.allowance(tokenId, operator); + if ( + !_isApprovedOrOwner(operator, tokenId) && + currentAllowance != type(uint256).max + ) { + if (currentAllowance < value) + revert InsufficientBalance(currentAllowance, value); + + _approve(tokenId, operator, currentAllowance - value); + } + } + + function _approve( + uint256 tokenId, + address to, + uint256 value + ) internal virtual { + LibERC3525Storage.s()._valueApprovals[tokenId].set(to, value); + + emit ApprovalValue(tokenId, to, value); + } + + function _getNewTokenId( + uint256 fromTokenId + ) internal virtual returns (uint256) { + fromTokenId; + + return ERC721EnumerableCore.totalSupply() + 1; + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual { + from; + to; + fromTokenId; + toTokenId; + slot; + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual { + from; + to; + fromTokenId; + toTokenId; + slot; + value; + } +} diff --git a/contracts-modularized/ERC3525/ERC3525SlotApprovableCore.sol b/contracts-modularized/ERC3525/ERC3525SlotApprovableCore.sol new file mode 100644 index 000000000..03d4a0746 --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525SlotApprovableCore.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC3525Core.sol"; +import "./interfaces/IERC3525SlotApprovableUpgradeable.sol"; +import "./ERC3525Storage.sol"; + +abstract contract ERC3525SlotApprovableCore is ERC3525Core { + event ApprovalForSlot( + address indexed _owner, + uint256 indexed _slot, + address indexed _operator, + bool _approved + ); + + function setApprovalForSlot( + address owner_, + uint256 slot_, + address operator_, + bool approved_ + ) internal virtual { + require( + _msgSender() == owner_ || isApprovedForAll(owner_, _msgSender()), + "ERC3525SlotApprovable: caller is not owner nor approved for all" + ); + _setApprovalForSlot(owner_, slot_, operator_, approved_); + } + + function isApprovedForSlot( + address owner_, + uint256 slot_, + address operator_ + ) internal view virtual returns (bool) { + return + LibERC3525SlotApprovableStorage.s()._slotApprovals[owner_][slot_][ + operator_ + ]; + } + + function approve( + address to_, + uint256 tokenId_ + ) internal virtual override(ERC721Core) { + address owner = ERC721Core.ownerOf(tokenId_); + uint256 slot = ERC3525Core.slotOf(tokenId_); + require(to_ != owner, "ERC3525: approval to current owner"); + + require( + _msgSender() == owner || + ERC721Core.isApprovedForAll(owner, _msgSender()) || + ERC3525SlotApprovableCore.isApprovedForSlot( + owner, + slot, + _msgSender() + ), + "ERC3525: caller is not owner nor approved" + ); + + _approve(to_, tokenId_); + } + + function approve( + uint256 tokenId_, + address to_, + uint256 value_ + ) internal virtual override(ERC3525Core) { + address owner = ERC721Core.ownerOf(tokenId_); + require(to_ != owner, "ERC3525: approval to current owner"); + + require( + _isApprovedOrOwner(_msgSender(), tokenId_), + "ERC3525: caller is not owner nor approved" + ); + + _approve(tokenId_, to_, value_); + } + + function _setApprovalForSlot( + address owner_, + uint256 slot_, + address operator_, + bool approved_ + ) internal virtual { + require(owner_ != operator_, "ERC3525SlotApprovable: approve to owner"); + LibERC3525SlotApprovableStorage.s()._slotApprovals[owner_][slot_][ + operator_ + ] = approved_; + emit ApprovalForSlot(owner_, slot_, operator_, approved_); + } + + function _isApprovedOrOwner( + address operator_, + uint256 tokenId_ + ) internal view virtual override returns (bool) { + require( + _exists(tokenId_), + "ERC3525: operator query for nonexistent token" + ); + address owner = ERC721Core.ownerOf(tokenId_); + uint256 slot = ERC3525Core.slotOf(tokenId_); + return (operator_ == owner || + getApproved(tokenId_) == operator_ || + ERC721Core.isApprovedForAll(owner, operator_) || + ERC3525SlotApprovableCore.isApprovedForSlot( + owner, + slot, + operator_ + )); + } +} diff --git a/contracts-modularized/ERC3525/ERC3525SlotApprovableUpgradeableDS.sol b/contracts-modularized/ERC3525/ERC3525SlotApprovableUpgradeableDS.sol new file mode 100644 index 000000000..8db43307e --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525SlotApprovableUpgradeableDS.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC3525UpgradeableDS.sol"; +import "./interfaces/IERC3525SlotApprovableUpgradeable.sol"; +import "./ERC3525Storage.sol"; + +abstract contract ERC3525SlotApprovableUpgradeableDS is + ERC3525UpgradeableDS, + IERC3525SlotApprovableUpgradeable +{ + function __ERC3525SlotApprovable_init() internal onlyInitializing { + __ERC3525SlotApprovable_init_unchained(); + } + + function __ERC3525SlotApprovable_init_unchained() + internal + onlyInitializing + {} + + function setApprovalForSlot( + address owner_, + uint256 slot_, + address operator_, + bool approved_ + ) external payable virtual override { + require( + _msgSender() == owner_ || isApprovedForAll(owner_, _msgSender()), + "ERC3525SlotApprovable: caller is not owner nor approved for all" + ); + _setApprovalForSlot(owner_, slot_, operator_, approved_); + } + + function isApprovedForSlot( + address owner_, + uint256 slot_, + address operator_ + ) public view virtual override returns (bool) { + return + LibERC3525SlotApprovableStorage.s()._slotApprovals[owner_][slot_][ + operator_ + ]; + } + + function approve( + address to_, + uint256 tokenId_ + ) public virtual override(IERC721Upgradeable, ERC721Upgradeable) { + address owner = ERC721Upgradeable.ownerOf(tokenId_); + uint256 slot = ERC3525UpgradeableDS.slotOf(tokenId_); + require(to_ != owner, "ERC3525: approval to current owner"); + + require( + _msgSender() == owner || + ERC721Upgradeable.isApprovedForAll(owner, _msgSender()) || + ERC3525SlotApprovableUpgradeableDS.isApprovedForSlot( + owner, + slot, + _msgSender() + ), + "ERC3525: caller is not owner nor approved" + ); + + _approve(to_, tokenId_); + } + + function approve( + uint256 tokenId_, + address to_, + uint256 value_ + ) + public + payable + virtual + override(IERC3525Upgradeable, ERC3525UpgradeableDS) + { + address owner = ERC721Upgradeable.ownerOf(tokenId_); + require(to_ != owner, "ERC3525: approval to current owner"); + + require( + _isApprovedOrOwner(_msgSender(), tokenId_), + "ERC3525: caller is not owner nor approved" + ); + + _approve(tokenId_, to_, value_); + } + + function _setApprovalForSlot( + address owner_, + uint256 slot_, + address operator_, + bool approved_ + ) internal virtual { + require(owner_ != operator_, "ERC3525SlotApprovable: approve to owner"); + LibERC3525SlotApprovableStorage.s()._slotApprovals[owner_][slot_][ + operator_ + ] = approved_; + emit ApprovalForSlot(owner_, slot_, operator_, approved_); + } + + function _isApprovedOrOwner( + address operator_, + uint256 tokenId_ + ) internal view virtual override returns (bool) { + require( + _exists(tokenId_), + "ERC3525: operator query for nonexistent token" + ); + address owner = ERC721Upgradeable.ownerOf(tokenId_); + uint256 slot = ERC3525UpgradeableDS.slotOf(tokenId_); + return (operator_ == owner || + getApproved(tokenId_) == operator_ || + ERC721Upgradeable.isApprovedForAll(owner, operator_) || + ERC3525SlotApprovableUpgradeableDS.isApprovedForSlot( + owner, + slot, + operator_ + )); + } +} diff --git a/contracts-modularized/ERC3525/ERC3525SlotEnumerableCore.sol b/contracts-modularized/ERC3525/ERC3525SlotEnumerableCore.sol new file mode 100644 index 000000000..a7eddb837 --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525SlotEnumerableCore.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; + +import "./ERC3525Storage.sol"; +import "./ERC3525Core.sol"; + +contract ERC3525SlotEnumerableCore is ERC3525Core { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + function slotCount() internal view virtual returns (uint256) { + return LibERC3525SlotEnumerableStorage.s()._allSlots.length(); + } + + function slotByIndex( + uint256 index + ) internal view virtual returns (uint256) { + if (index >= LibERC3525SlotEnumerableStorage.s()._allSlots.length()) + revert IndexOutOfBounds( + index, + LibERC3525SlotEnumerableStorage.s()._allSlots.length() + ); + + return LibERC3525SlotEnumerableStorage.s()._allSlots.at(index); + } + + function _slotExists(uint256 slot) internal view virtual returns (bool) { + return + LibERC3525SlotEnumerableStorage.s()._allSlots.length() > 0 && + LibERC3525SlotEnumerableStorage.s()._allSlots.contains(slot); + } + + function tokenSupplyInSlot( + uint256 slot + ) internal view virtual returns (uint256) { + if (!_slotExists(slot)) revert NotFound(slot); + + return LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length(); + } + + function tokenInSlotByIndex( + uint256 slot, + uint256 index + ) internal view virtual returns (uint256) { + if (!_slotExists(slot)) revert NotFound(slot); + if ( + index >= + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length() + ) + revert IndexOutOfBounds( + index, + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length() + ); + + return + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].at(index); + } + + function _tokenCountInSlot( + uint256 slot + ) internal view virtual returns (uint256) { + return LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length(); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + ERC3525Core._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (from == address(0) && fromTokenId == 0) { + if (!_slotExists(slot)) { + LibERC3525SlotEnumerableStorage.s()._allSlots.add(slot); + } + + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].add( + toTokenId + ); + } + + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + ERC3525Core._afterValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (to == address(0) && toTokenId == 0) { + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].remove( + fromTokenId + ); + + if (_tokenCountInSlot(slot) == 0) { + LibERC3525SlotEnumerableStorage.s()._allSlots.remove(slot); + } + } + + value; + } +} diff --git a/contracts-modularized/ERC3525/ERC3525SlotEnumerableUpgradeableDS.sol b/contracts-modularized/ERC3525/ERC3525SlotEnumerableUpgradeableDS.sol new file mode 100644 index 000000000..1c06c8e9a --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525SlotEnumerableUpgradeableDS.sol @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; + +import "./ERC3525UpgradeableDS.sol"; +import "./interfaces/IERC3525SlotEnumerableUpgradeable.sol"; +import "./ERC3525Storage.sol"; + +abstract contract ERC3525SlotEnumerableUpgradeableDS is + ERC3525UpgradeableDS, + IERC3525SlotEnumerableUpgradeable +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + function __ERC3525SlotEnumerable_init() internal onlyInitializing { + __ERC3525SlotEnumerable_init_unchained(); + } + + function __ERC3525SlotEnumerable_init_unchained() + internal + onlyInitializing + {} + + function slotCount() public view virtual override returns (uint256) { + return LibERC3525SlotEnumerableStorage.s()._allSlots.length(); + } + + function slotByIndex( + uint256 index + ) public view virtual override returns (uint256) { + if (index >= LibERC3525SlotEnumerableStorage.s()._allSlots.length()) + revert IndexOutOfBounds( + index, + LibERC3525SlotEnumerableStorage.s()._allSlots.length() + ); + + return LibERC3525SlotEnumerableStorage.s()._allSlots.at(index); + } + + function _slotExists(uint256 slot) internal view virtual returns (bool) { + return + LibERC3525SlotEnumerableStorage.s()._allSlots.length() > 0 && + LibERC3525SlotEnumerableStorage.s()._allSlots.contains(slot); + } + + function tokenSupplyInSlot( + uint256 slot + ) public view virtual override returns (uint256) { + if (!_slotExists(slot)) revert NotFound(slot); + + return LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length(); + } + + function tokenInSlotByIndex( + uint256 slot, + uint256 index + ) external view virtual override returns (uint256) { + if (!_slotExists(slot)) revert NotFound(slot); + if ( + index >= + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length() + ) + revert IndexOutOfBounds( + index, + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length() + ); + + return + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].at(index); + } + + function _tokenCountInSlot( + uint256 slot + ) internal view virtual returns (uint256) { + return LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].length(); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + ERC3525UpgradeableDS._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (from == address(0) && fromTokenId == 0) { + if (!_slotExists(slot)) { + LibERC3525SlotEnumerableStorage.s()._allSlots.add(slot); + } + + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].add( + toTokenId + ); + } + + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + ERC3525UpgradeableDS._afterValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (to == address(0) && toTokenId == 0) { + LibERC3525SlotEnumerableStorage.s()._tokensInSlot[slot].remove( + fromTokenId + ); + + if (_tokenCountInSlot(slot) == 0) { + LibERC3525SlotEnumerableStorage.s()._allSlots.remove(slot); + } + } + + value; + } +} diff --git a/contracts-modularized/ERC3525/ERC3525Storage.sol b/contracts-modularized/ERC3525/ERC3525Storage.sol new file mode 100644 index 000000000..2c1666aa5 --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525Storage.sol @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; + +library LibERC3525Storage { + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc3525.storage"); + + struct ERC3525Storage { + /// @dev tokenId => values + mapping(uint256 => uint256) _values; + /// @dev tokenId => operators => allowances + mapping(uint256 => EnumerableMapUpgradeable.AddressToUintMap) _valueApprovals; + /// @dev tokenId => slot + mapping(uint256 => uint256) _slots; + uint8 _decimals; + } + + function s() internal pure returns (ERC3525Storage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +library LibERC3525SlotEnumerableStorage { + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc3525SlotEnumerable.storage"); + + struct ERC3525SlotEnumerableStorage { + mapping(uint256 => EnumerableSetUpgradeable.UintSet) _tokensInSlot; + EnumerableSetUpgradeable.UintSet _allSlots; + } + + function s() + internal + pure + returns (ERC3525SlotEnumerableStorage storage ds) + { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +library LibERC3525SlotApprovableStorage { + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc3525SlotEnumerable.storage"); + + struct ERC3525SlotApprovableStorage { + mapping(address => mapping(uint256 => mapping(address => bool))) _slotApprovals; + } + + function s() + internal + pure + returns (ERC3525SlotApprovableStorage storage ds) + { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC3525/ERC3525UpgradeableDS.sol b/contracts-modularized/ERC3525/ERC3525UpgradeableDS.sol new file mode 100644 index 000000000..101aad163 --- /dev/null +++ b/contracts-modularized/ERC3525/ERC3525UpgradeableDS.sol @@ -0,0 +1,325 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; + +import "../ERC721/ERC721EnumerableUpgradeable.sol"; +import "./interfaces/IERC3525Upgradeable.sol"; +import "./interfaces/IERC3525MetadataUpgradeable.sol"; +import "./ERC3525Storage.sol"; +import "../ERC721/ERC721Storage.sol"; + +contract ERC3525UpgradeableDS is + IERC3525Upgradeable, + IERC3525MetadataUpgradeable, + ERC721EnumerableUpgradeable +{ + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + function __ERC3525_init_unchained( + uint8 decimals_ + ) internal onlyInitializing { + LibERC3525Storage.s()._decimals = decimals_; + } + + function supportsInterface( + bytes4 interfaceId + ) + public + view + virtual + override(IERC165Upgradeable, ERC721EnumerableUpgradeable) + returns (bool) + { + return + interfaceId == type(IERC3525Upgradeable).interfaceId || + interfaceId == type(IERC3525MetadataUpgradeable).interfaceId || + super.supportsInterface(interfaceId); + } + + function valueDecimals() public view virtual override returns (uint8) { + return LibERC3525Storage.s()._decimals; + } + + function balanceOf( + uint256 tokenId + ) public view virtual override returns (uint256) { + _requireMinted(tokenId); + + return LibERC3525Storage.s()._values[tokenId]; + } + + function slotOf( + uint256 tokenId + ) public view virtual override returns (uint256) { + _requireMinted(tokenId); + + return LibERC3525Storage.s()._slots[tokenId]; + } + + function contractURI() + public + view + virtual + override + returns (string memory) + { + string memory baseURI = _baseURI(); + return + bytes(baseURI).length > 0 + ? string(abi.encodePacked(baseURI, address(this).toHexString())) + : ""; + } + + function slotURI( + uint256 slot + ) public view virtual override returns (string memory) { + string memory contractUri = contractURI(); + return + bytes(contractUri).length > 0 + ? string( + abi.encodePacked(contractUri, "/slots/", slot.toString()) + ) + : ""; + } + + function tokenURI( + uint256 tokenId + ) + public + view + virtual + override(ERC721Upgradeable, IERC721MetadataUpgradeable) + returns (string memory) + { + _requireMinted(tokenId); + + string memory _tokenURI = LibERC721Storage.s()._tokenURIs[tokenId]; + if (bytes(_tokenURI).length > 0) { + return _tokenURI; + } + + string memory contractUri = contractURI(); + return + bytes(contractUri).length > 0 + ? string( + abi.encodePacked( + contractUri, + "/tokens/", + tokenId.toString() + ) + ) + : ""; + } + + function approve( + uint256 tokenId, + address to, + uint256 value + ) public payable virtual override { + approve(to, tokenId); + + if (!ERC721Upgradeable._isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + + _approve(tokenId, to, value); + } + + function allowance( + uint256 tokenId, + address operator + ) public view virtual override returns (uint256) { + return LibERC3525Storage.s()._valueApprovals[tokenId].get(operator); + } + + function transferFrom( + uint256 fromTokenId, + address to, + uint256 value + ) public payable virtual override returns (uint256) { + _spendAllowance(_msgSender(), fromTokenId, value); + + uint256 newTokenId = _getNewTokenId(fromTokenId); + _mint(to, newTokenId, LibERC3525Storage.s()._slots[fromTokenId]); + _transfer(fromTokenId, newTokenId, value); + + return newTokenId; + } + + function transferFrom( + uint256 fromTokenId, + uint256 toTokenId, + uint256 value + ) public payable virtual override { + _spendAllowance(_msgSender(), fromTokenId, value); + + if ( + LibERC3525Storage.s()._slots[fromTokenId] != + LibERC3525Storage.s()._slots[toTokenId] + ) + revert Mismatch( + LibERC3525Storage.s()._slots[fromTokenId], + LibERC3525Storage.s()._slots[toTokenId] + ); + + _transfer(fromTokenId, toTokenId, value); + } + + function _mint(address to, uint256 tokenId, uint256 slot) internal virtual { + if (tokenId == 0 || slot == 0) revert NullValue(); + + ERC721Upgradeable._mint(to, tokenId); + LibERC3525Storage.s()._slots[tokenId] = slot; + + emit SlotChanged(tokenId, 0, slot); + } + + function _mint(uint256 tokenId, uint256 value) internal virtual { + _requireMinted(tokenId); + + address owner = ownerOf(tokenId); + uint256 slot = slotOf(tokenId); + + _beforeValueTransfer(address(0), owner, 0, tokenId, slot, value); + + LibERC3525Storage.s()._values[tokenId] = value; + emit TransferValue(0, tokenId, value); + + _afterValueTransfer(address(0), owner, 0, tokenId, slot, value); + } + + function _burn(uint256 tokenId) internal virtual override { + address owner = ERC721Upgradeable.ownerOf(tokenId); + ERC721Upgradeable._burn(tokenId); + + uint256 slot = LibERC3525Storage.s()._slots[tokenId]; + uint256 value = LibERC3525Storage.s()._values[tokenId]; + + _beforeValueTransfer(owner, address(0), tokenId, 0, slot, value); + + delete LibERC3525Storage.s()._slots[tokenId]; + delete LibERC3525Storage.s()._values[tokenId]; + + _afterValueTransfer(owner, address(0), tokenId, 0, slot, value); + + emit TransferValue(tokenId, 0, value); + emit SlotChanged(tokenId, slot, 0); + } + + function _burn(uint256 tokenId, uint256 value) internal virtual { + address owner = ERC721Upgradeable.ownerOf(tokenId); + uint256 slot = LibERC3525Storage.s()._slots[tokenId]; + + if (LibERC3525Storage.s()._values[tokenId] < value) + revert InsufficientBalance( + LibERC3525Storage.s()._values[tokenId], + value + ); + + _beforeValueTransfer(owner, address(0), tokenId, 0, slot, value); + + delete LibERC3525Storage.s()._valueApprovals[tokenId]; + + LibERC3525Storage.s()._values[tokenId] -= value; + + _afterValueTransfer(owner, address(0), tokenId, 0, slot, value); + + emit TransferValue(tokenId, 0, value); + } + + function _transfer( + uint256 fromTokenId, + uint256 toTokenId, + uint256 value + ) internal virtual { + address from = ERC721Upgradeable.ownerOf(fromTokenId); + address to = ERC721Upgradeable.ownerOf(toTokenId); + uint256 slot = LibERC3525Storage.s()._slots[fromTokenId]; + + _beforeValueTransfer(from, to, fromTokenId, toTokenId, slot, value); + + delete LibERC3525Storage.s()._valueApprovals[fromTokenId]; + + LibERC3525Storage.s()._values[fromTokenId] -= value; + LibERC3525Storage.s()._values[toTokenId] += value; + + _afterValueTransfer(from, to, fromTokenId, toTokenId, slot, value); + + emit TransferValue(fromTokenId, toTokenId, value); + } + + function _spendAllowance( + address operator, + uint256 tokenId, + uint256 value + ) internal virtual { + if (ownerOf(tokenId) == operator) return; + uint256 currentAllowance = ERC3525UpgradeableDS.allowance( + tokenId, + operator + ); + if ( + !_isApprovedOrOwner(operator, tokenId) && + currentAllowance != type(uint256).max + ) { + if (currentAllowance < value) + revert InsufficientBalance(currentAllowance, value); + + _approve(tokenId, operator, currentAllowance - value); + } + } + + function _approve( + uint256 tokenId, + address to, + uint256 value + ) internal virtual { + LibERC3525Storage.s()._valueApprovals[tokenId].set(to, value); + + emit ApprovalValue(tokenId, to, value); + } + + function _getNewTokenId( + uint256 fromTokenId + ) internal virtual returns (uint256) { + fromTokenId; + + return ERC721EnumerableUpgradeable.totalSupply() + 1; + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual { + from; + to; + fromTokenId; + toTokenId; + slot; + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual { + from; + to; + fromTokenId; + toTokenId; + slot; + value; + } +} diff --git a/contracts-modularized/ERC3525/interfaces/IERC3525MetadataUpgradeable.sol b/contracts-modularized/ERC3525/interfaces/IERC3525MetadataUpgradeable.sol new file mode 100644 index 000000000..6770d8a78 --- /dev/null +++ b/contracts-modularized/ERC3525/interfaces/IERC3525MetadataUpgradeable.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC3525Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; + +/** + * @title ERC-3525 Semi-Fungible Token Standard, optional extension for metadata + * @dev Interfaces for any contract that wants to support query of the Uniform Resource Identifier + * (URI) for the ERC3525 contract as well as a specified slot. + * Because of the higher reliability of data stored in smart contracts compared to data stored in + * centralized systems, it is recommended that metadata, including `contractURI`, `slotURI` and + * `tokenURI`, be directly returned in JSON format, instead of being returned with a url pointing + * to any resource stored in a centralized system. + * See https://eips.ethereum.org/EIPS/eip-3525 + * Note: the ERC-165 identifier for this interface is 0xe1600902. + */ +interface IERC3525MetadataUpgradeable is + IERC3525Upgradeable, + IERC721MetadataUpgradeable +{ + /** + * @notice Returns the Uniform Resource Identifier (URI) for the current ERC3525 contract. + * @dev This function SHOULD return the URI for this contract in JSON format, starting with + * header `data:application/json;`. + * See https://eips.ethereum.org/EIPS/eip-3525 for the JSON schema for contract URI. + * @return The JSON formatted URI of the current ERC3525 contract + */ + function contractURI() external view returns (string memory); + + /** + * @notice Returns the Uniform Resource Identifier (URI) for the specified slot. + * @dev This function SHOULD return the URI for `_slot` in JSON format, starting with header + * `data:application/json;`. + * See https://eips.ethereum.org/EIPS/eip-3525 for the JSON schema for slot URI. + * @return The JSON formatted URI of `_slot` + */ + function slotURI(uint256 _slot) external view returns (string memory); +} diff --git a/contracts-modularized/ERC3525/interfaces/IERC3525ReceiverUpgradeable.sol b/contracts-modularized/ERC3525/interfaces/IERC3525ReceiverUpgradeable.sol new file mode 100644 index 000000000..11ba5c233 --- /dev/null +++ b/contracts-modularized/ERC3525/interfaces/IERC3525ReceiverUpgradeable.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.0; + +/** + * @title EIP-3525 token receiver interface + * @dev Interface for a smart contract that wants to be informed by EIP-3525 contracts when + * receiving values from ANY addresses or EIP-3525 tokens. + * Note: the EIP-165 identifier for this interface is 0x009ce20b. + */ +interface IERC3525ReceiverUpgradeable { + /** + * @notice Handle the receipt of an EIP-3525 token value. + * @dev An EIP-3525 smart contract MUST check whether this function is implemented by the + * recipient contract, if the recipient contract implements this function, the EIP-3525 + * contract MUST call this function after a value transfer (i.e. `transferFrom(uint256, + * uint256,uint256,bytes)`). + * MUST return 0x009ce20b (i.e. `bytes4(keccak256('onERC3525Received(address,uint256,uint256, + * uint256,bytes)'))`) if the transfer is accepted. + * MUST revert or return any value other than 0x009ce20b if the transfer is rejected. + * @param _operator The address which triggered the transfer + * @param _fromTokenId The token id to transfer value from + * @param _toTokenId The token id to transfer value to + * @param _value The transferred value + * @param _data Additional data with no specified format + * @return `bytes4(keccak256('onERC3525Received(address,uint256,uint256,uint256,bytes)'))` + * unless the transfer is rejected. + */ + function onERC3525Received( + address _operator, + uint256 _fromTokenId, + uint256 _toTokenId, + uint256 _value, + bytes calldata _data + ) external returns (bytes4); +} diff --git a/contracts-modularized/ERC3525/interfaces/IERC3525SlotApprovableUpgradeable.sol b/contracts-modularized/ERC3525/interfaces/IERC3525SlotApprovableUpgradeable.sol new file mode 100644 index 000000000..4b748b589 --- /dev/null +++ b/contracts-modularized/ERC3525/interfaces/IERC3525SlotApprovableUpgradeable.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC3525Upgradeable.sol"; + +/** + * @title ERC-3525 Semi-Fungible Token Standard, optional extension for approval of slot level + * @dev Interfaces for any contract that wants to support approval of slot level, which allows an + * operator to manage one's tokens with the same slot. + * See https://eips.ethereum.org/EIPS/eip-3525 + * Note: the ERC-165 identifier for this interface is 0xb688be58. + */ +interface IERC3525SlotApprovableUpgradeable is IERC3525Upgradeable { + /** + * @dev MUST emits when an operator is approved or disapproved to manage all of `_owner`'s + * tokens with the same slot. + * @param _owner The address whose tokens are approved + * @param _slot The slot to approve, all of `_owner`'s tokens with this slot are approved + * @param _operator The operator being approved or disapproved + * @param _approved Identify if `_operator` is approved or disapproved + */ + event ApprovalForSlot( + address indexed _owner, + uint256 indexed _slot, + address indexed _operator, + bool _approved + ); + + /** + * @notice Approve or disapprove an operator to manage all of `_owner`'s tokens with the + * specified slot. + * @dev Caller SHOULD be `_owner` or an operator who has been authorized through + * `setApprovalForAll`. + * MUST emit ApprovalSlot event. + * @param _owner The address that owns the ERC3525 tokens + * @param _slot The slot of tokens being queried approval of + * @param _operator The address for whom to query approval + * @param _approved Identify if `_operator` would be approved or disapproved + */ + function setApprovalForSlot( + address _owner, + uint256 _slot, + address _operator, + bool _approved + ) external payable; + + /** + * @notice Query if `_operator` is authorized to manage all of `_owner`'s tokens with the + * specified slot. + * @param _owner The address that owns the ERC3525 tokens + * @param _slot The slot of tokens being queried approval of + * @param _operator The address for whom to query approval + * @return True if `_operator` is authorized to manage all of `_owner`'s tokens with `_slot`, + * false otherwise. + */ + function isApprovedForSlot( + address _owner, + uint256 _slot, + address _operator + ) external view returns (bool); +} diff --git a/contracts-modularized/ERC3525/interfaces/IERC3525SlotEnumerableUpgradeable.sol b/contracts-modularized/ERC3525/interfaces/IERC3525SlotEnumerableUpgradeable.sol new file mode 100644 index 000000000..230bc7505 --- /dev/null +++ b/contracts-modularized/ERC3525/interfaces/IERC3525SlotEnumerableUpgradeable.sol @@ -0,0 +1,48 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC3525Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; + +/** + * @title ERC-3525 Semi-Fungible Token Standard, optional extension for slot enumeration + * @dev Interfaces for any contract that wants to support enumeration of slots as well as tokens + * with the same slot. + * See https://eips.ethereum.org/EIPS/eip-3525 + * Note: the ERC-165 identifier for this interface is 0x3b741b9e. + */ +interface IERC3525SlotEnumerableUpgradeable is + IERC3525Upgradeable, + IERC721EnumerableUpgradeable +{ + /** + * @notice Get the total amount of slots stored by the contract. + * @return The total amount of slots + */ + function slotCount() external view returns (uint256); + + /** + * @notice Get the slot at the specified index of all slots stored by the contract. + * @param _index The index in the slot list + * @return The slot at `index` of all slots. + */ + function slotByIndex(uint256 _index) external view returns (uint256); + + /** + * @notice Get the total amount of tokens with the same slot. + * @param _slot The slot to query token supply for + * @return The total amount of tokens with the specified `_slot` + */ + function tokenSupplyInSlot(uint256 _slot) external view returns (uint256); + + /** + * @notice Get the token at the specified index of all tokens with the same slot. + * @param _slot The slot to query tokens with + * @param _index The index in the token list of the slot + * @return The token ID at `_index` of all tokens with `_slot` + */ + function tokenInSlotByIndex( + uint256 _slot, + uint256 _index + ) external view returns (uint256); +} diff --git a/contracts-modularized/ERC3525/interfaces/IERC3525Upgradeable.sol b/contracts-modularized/ERC3525/interfaces/IERC3525Upgradeable.sol new file mode 100644 index 000000000..c15b7c355 --- /dev/null +++ b/contracts-modularized/ERC3525/interfaces/IERC3525Upgradeable.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; + +/** + * @title ERC-3525 Semi-Fungible Token Standard + * @dev See https://eips.ethereum.org/EIPS/eip-3525 + * Note: the ERC-165 identifier for this interface is 0xc97ae3d5. + */ +interface IERC3525Upgradeable is IERC721Upgradeable { + /** + * @dev MUST emit when value of a token is transferred to another token with the same slot, + * including zero value transfers (_value == 0) as well as transfers when tokens are created + * (`_fromTokenId` == 0) or destroyed (`_toTokenId` == 0). + * @param _fromTokenId The token id to transfer value from + * @param _toTokenId The token id to transfer value to + * @param _value The transferred value + */ + event TransferValue( + uint256 indexed _fromTokenId, + uint256 indexed _toTokenId, + uint256 _value + ); + + /** + * @dev MUST emits when the approval value of a token is set or changed. + * @param _tokenId The token to approve + * @param _operator The operator to approve for + * @param _value The maximum value that `_operator` is allowed to manage + */ + event ApprovalValue( + uint256 indexed _tokenId, + address indexed _operator, + uint256 _value + ); + + /** + * @dev MUST emit when the slot of a token is set or changed. + * @param _tokenId The token of which slot is set or changed + * @param _oldSlot The previous slot of the token + * @param _newSlot The updated slot of the token + */ + event SlotChanged( + uint256 indexed _tokenId, + uint256 indexed _oldSlot, + uint256 indexed _newSlot + ); + + /** + * @notice Get the number of decimals the token uses for value - e.g. 6, means the user + * representation of the value of a token can be calculated by dividing it by 1,000,000. + * Considering the compatibility with third-party wallets, this function is defined as + * `valueDecimals()` instead of `decimals()` to avoid conflict with ERC20 tokens. + * @return The number of decimals for value + */ + function valueDecimals() external view returns (uint8); + + /** + * @notice Get the value of a token. + * @param _tokenId The token for which to query the balance + * @return The value of `_tokenId` + */ + function balanceOf(uint256 _tokenId) external view returns (uint256); + + /** + * @notice Get the slot of a token. + * @param _tokenId The identifier for a token + * @return The slot of the token + */ + function slotOf(uint256 _tokenId) external view returns (uint256); + + /** + * @notice Allow an operator to manage the value of a token, up to the `_value` amount. + * @dev MUST revert unless caller is the current owner, an authorized operator, or the approved + * address for `_tokenId`. + * MUST emit ApprovalValue event. + * @param _tokenId The token to approve + * @param _operator The operator to be approved + * @param _value The maximum value of `_toTokenId` that `_operator` is allowed to manage + */ + function approve( + uint256 _tokenId, + address _operator, + uint256 _value + ) external payable; + + /** + * @notice Get the maximum value of a token that an operator is allowed to manage. + * @param _tokenId The token for which to query the allowance + * @param _operator The address of an operator + * @return The current approval value of `_tokenId` that `_operator` is allowed to manage + */ + function allowance( + uint256 _tokenId, + address _operator + ) external view returns (uint256); + + /** + * @notice Transfer value from a specified token to another specified token with the same slot. + * @dev Caller MUST be the current owner, an authorized operator or an operator who has been + * approved the whole `_fromTokenId` or part of it. + * MUST revert if `_fromTokenId` or `_toTokenId` is zero token id or does not exist. + * MUST revert if slots of `_fromTokenId` and `_toTokenId` do not match. + * MUST revert if `_value` exceeds the balance of `_fromTokenId` or its allowance to the + * operator. + * MUST emit `TransferValue` event. + * @param _fromTokenId The token to transfer value from + * @param _toTokenId The token to transfer value to + * @param _value The transferred value + */ + function transferFrom( + uint256 _fromTokenId, + uint256 _toTokenId, + uint256 _value + ) external payable; + + /** + * @notice Transfer value from a specified token to an address. The caller should confirm that + * `_to` is capable of receiving ERC3525 tokens. + * @dev This function MUST create a new ERC3525 token with the same slot for `_to` to receive + * the transferred value. + * MUST revert if `_fromTokenId` is zero token id or does not exist. + * MUST revert if `_to` is zero address. + * MUST revert if `_value` exceeds the balance of `_fromTokenId` or its allowance to the + * operator. + * MUST emit `Transfer` and `TransferValue` events. + * @param _fromTokenId The token to transfer value from + * @param _to The address to transfer value to + * @param _value The transferred value + * @return ID of the new token created for `_to` which receives the transferred value + */ + function transferFrom( + uint256 _fromTokenId, + address _to, + uint256 _value + ) external payable returns (uint256); +} diff --git a/contracts-modularized/ERC4906/interfaces/IERC4906Upgradeable.sol b/contracts-modularized/ERC4906/interfaces/IERC4906Upgradeable.sol new file mode 100644 index 000000000..edfc6acfe --- /dev/null +++ b/contracts-modularized/ERC4906/interfaces/IERC4906Upgradeable.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; + +/** + * @title EIP-721 Metadata Update Extension + */ +interface IERC4906Upgradeable is IERC721Upgradeable { + /** + * @dev This event emits when the metadata of a token is changed. + * So that the third-party platforms such as NFT market could + * timely update the images and related attributes of the NFT. + */ + event MetadataUpdate(uint256 _tokenId); + + /** + * @dev This event emits when the metadata of a range of tokens is changed. + * So that the third-party platforms such as NFT market could + * timely update the images and related attributes of the NFTs. + */ + event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); +} diff --git a/contracts-modularized/ERC5192/interfaces/IERC5192Upgradeable.sol b/contracts-modularized/ERC5192/interfaces/IERC5192Upgradeable.sol new file mode 100644 index 000000000..cc6bd2dce --- /dev/null +++ b/contracts-modularized/ERC5192/interfaces/IERC5192Upgradeable.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; + +interface IERC5192Upgradeable is IERC721Upgradeable { + /** + * @notice Emitted when the locking status is changed to locked. + * @dev If a token is minted and the status is locked, this event should be emitted. + * @param tokenId The identifier for a token. + */ + event Locked(uint256 tokenId); + + /** + * @notice Emitted when the locking status is changed to unlocked. + * @dev If a token is minted and the status is unlocked, this event should be emitted. + * @param tokenId The identifier for a token. + */ + event Unlocked(uint256 tokenId); + + /** + * @notice Returns the locking status of an Soulbound Token + * @dev SBTs assigned to zero address are considered invalid, and queries + * about them do throw. + * @param tokenId The identifier for an SBT. + */ + function locked(uint256 tokenId) external view returns (bool); +} diff --git a/contracts-modularized/ERC5484/interfaces/IERC5484Upgradeable.sol b/contracts-modularized/ERC5484/interfaces/IERC5484Upgradeable.sol new file mode 100644 index 000000000..e16e53287 --- /dev/null +++ b/contracts-modularized/ERC5484/interfaces/IERC5484Upgradeable.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; + +interface IERC5484Upgradeable is IERC721Upgradeable { + // A guideline to standardlize burn-authorization's number coding + enum BurnAuth { + IssuerOnly, + OwnerOnly, + Both, + Neither + } + + /** + * @notice Emitted when a soulbound token is issued. + * @dev This emit is an add-on to nft's transfer emit in order to distinguish sbt from vanilla nft while providing backward compatibility. + * @param from The issuer + * @param to The receiver + */ + event Issued( + address indexed from, + address indexed to, + uint256 indexed tokenId, + BurnAuth burnAuth + ); + + /** + * @notice provides burn authorization of the token id. + * @dev unassigned tokenIds are invalid, and queries do throw + * @param tokenId The identifier for a token. + */ + function burnAuth(uint256 tokenId) external view returns (BurnAuth); +} diff --git a/contracts-modularized/ERC5727/ERC5727ClaimableStorage.sol b/contracts-modularized/ERC5727/ERC5727ClaimableStorage.sol new file mode 100644 index 000000000..300654079 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727ClaimableStorage.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; + +library LibERC5727ClaimableStorage { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using MerkleProofUpgradeable for bytes32[]; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc5727Claimable.storage"); + + struct ERC5727ClaimableStorage { + // slot => merkelRoot + mapping(uint256 => bytes32) _merkelRoots; + mapping(uint256 => address) _slotIssuers; + mapping(address => EnumerableSetUpgradeable.UintSet) _claimed; + } + + function s() internal pure returns (ERC5727ClaimableStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC5727/ERC5727ClaimableUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727ClaimableUpgradeableDS.sol new file mode 100644 index 000000000..a513964d4 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727ClaimableUpgradeableDS.sol @@ -0,0 +1,92 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; + +import "./interfaces/IERC5727ClaimableUpgradeable.sol"; +import "./ERC5727ClaimableStorage.sol"; +import "../ERC5484/interfaces/IERC5484Upgradeable.sol"; +import "./ERC5727Core.sol"; + +contract ERC5727ClaimableUpgradeableDS is + IERC5727ClaimableUpgradeable, + ERC5727Core +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using MerkleProofUpgradeable for bytes32[]; + + function __ERC5727Claimable_init() internal onlyInitializing { + __ERC5727Claimable_init_unchained(); + } + + function __ERC5727Claimable_init_unchained() internal onlyInitializing {} + + function setClaimEvent( + address issuer, + uint256 slot, + bytes32 merkelRoot + ) external virtual onlyAdmin { + if ( + LibERC5727ClaimableStorage.s()._slotIssuers[slot] != address(0) || + LibERC5727ClaimableStorage.s()._merkelRoots[slot] != bytes32(0) + ) revert Conflict(slot); + + LibERC5727ClaimableStorage.s()._slotIssuers[slot] = issuer; + LibERC5727ClaimableStorage.s()._merkelRoots[slot] = merkelRoot; + } + + function claim( + address to, + uint256 tokenId, + uint256 amount, + uint256 slot, + IERC5484Upgradeable.BurnAuth burnAuth, + address verifier, + bytes calldata data, + bytes32[] calldata proof + ) external virtual override { + if (to == address(0) || tokenId == 0 || slot == 0) revert NullValue(); + if (to != _msgSender()) revert Unauthorized(_msgSender()); + + bytes32 merkelRoot = LibERC5727ClaimableStorage.s()._merkelRoots[slot]; + if (merkelRoot == bytes32(0)) revert NotClaimable(); + if (LibERC5727ClaimableStorage.s()._claimed[to].contains(slot)) + revert AlreadyClaimed(); + + bytes32 node = keccak256( + abi.encodePacked( + to, + tokenId, + amount, + slot, + burnAuth, + verifier, + data + ) + ); + if (!proof.verifyCalldata(merkelRoot, node)) revert Unauthorized(to); + + _issue( + LibERC5727ClaimableStorage.s()._slotIssuers[slot], + to, + tokenId, + slot, + burnAuth, + verifier + ); + _issue( + LibERC5727ClaimableStorage.s()._slotIssuers[slot], + tokenId, + amount + ); + + LibERC5727ClaimableStorage.s()._claimed[to].add(slot); + } + + function isClaimed( + address to, + uint256 slot + ) public view virtual returns (bool) { + return LibERC5727ClaimableStorage.s()._claimed[to].contains(slot); + } +} diff --git a/contracts-modularized/ERC5727/ERC5727Core.sol b/contracts-modularized/ERC5727/ERC5727Core.sol new file mode 100644 index 000000000..6acd90585 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727Core.sol @@ -0,0 +1,311 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/SignatureCheckerUpgradeable.sol"; + +import "../EIP712/EIP712Upgradeable.sol"; +import "./interfaces/IERC5727MetadataUpgradeable.sol"; +import "./interfaces/IERC5727EnumerableUpgradeable.sol"; +import "../ERC173/ERC173Upgradeable.sol"; +import "../diamond/libraries/LibDiamond.sol"; +import "./ERC5727Storage.sol"; +import "../ERC3525/ERC3525Core.sol"; +import "../ERC5484/interfaces/IERC5484Upgradeable.sol"; + +contract ERC5727Core is EIP712Upgradeable, ERC3525Core { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using SignatureCheckerUpgradeable for address; + + event Issued( + address indexed from, + address indexed to, + uint256 indexed tokenId, + IERC5484Upgradeable.BurnAuth burnAuth + ); + event Locked(uint256 tokenId); + event Unlocked(uint256 tokenId); + event Revoked(address indexed from, uint256 indexed tokenId); + event Verified(address indexed by, uint256 indexed tokenId, bool result); + + bytes32 private constant _TOKEN_TYPEHASH = + keccak256( + "Token(uint256 tokenId,address owner,uint256 value,uint256 slot,address issuer,address verifier,BurnAuth burnAuth)" + ); + + modifier onlyAdmin() { + if (owner() != _msgSender()) revert Unauthorized(_msgSender()); + _; + } + + modifier onlyMinter(uint256 slot) { + if (!_checkMintAuth(_msgSender(), slot)) + revert Unauthorized(_msgSender()); + _; + } + + modifier onlyBurner(uint256 tokenId) { + if (!_checkBurnAuth(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + _; + } + + modifier onlyIssuer(uint256 tokenId) { + if (_msgSender() != LibERC5727Storage.s()._issuers[tokenId]) + revert Unauthorized(_msgSender()); + _; + } + + function owner() internal view returns (address owner_) { + owner_ = LibDiamond.contractOwner(); + } + + function verifierOf( + uint256 tokenId + ) internal view virtual returns (address) { + address verifier = LibERC5727Storage.s()._verifiers[tokenId]; + if (verifier == address(0)) revert NotFound(tokenId); + + return verifier; + } + + function issuerOf(uint256 tokenId) internal view virtual returns (address) { + address issuer = LibERC5727Storage.s()._issuers[tokenId]; + if (issuer == address(0)) revert NotFound(tokenId); + + return issuer; + } + + function issue( + address to, + uint256 tokenId, + uint256 slot, + IERC5484Upgradeable.BurnAuth auth, + address verifier, + bytes calldata data + ) internal virtual onlyMinter(slot) { + if (tokenId == 0 || slot == 0 || to == address(0)) revert NullValue(); + + _issue(_msgSender(), to, tokenId, slot, auth, verifier); + + data; + } + + function issue( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) internal virtual onlyIssuer(tokenId) { + _requireMinted(tokenId); + + _issue(_msgSender(), tokenId, amount); + + data; + } + + function _issue( + address from, + address to, + uint256 tokenId, + uint256 slot, + IERC5484Upgradeable.BurnAuth auth, + address verifier + ) internal virtual { + _mint(to, tokenId, slot); + + LibERC5727Storage.s()._issuers[tokenId] = from; + LibERC5727Storage.s()._burnAuths[tokenId] = auth; + LibERC5727Storage.s()._verifiers[tokenId] = verifier; + + if ( + auth == IERC5484Upgradeable.BurnAuth.IssuerOnly || + auth == IERC5484Upgradeable.BurnAuth.Both + ) { + LibERC5727Storage.s()._burnerRole[tokenId][from] = true; + _approve(from, tokenId); + } + if ( + auth == IERC5484Upgradeable.BurnAuth.OwnerOnly || + auth == IERC5484Upgradeable.BurnAuth.Both + ) { + LibERC5727Storage.s()._burnerRole[tokenId][to] = true; + } + + emit Issued(from, to, tokenId, auth); + emit Locked(tokenId); + + _beforeValueTransfer(address(0), to, 0, tokenId, slot, 0); + _afterValueTransfer(address(0), to, 0, tokenId, slot, 0); + } + + function _issue( + address from, + uint256 tokenId, + uint256 amount + ) internal virtual { + _mint(tokenId, amount); + + IERC5484Upgradeable.BurnAuth auth = LibERC5727Storage.s()._burnAuths[ + tokenId + ]; + + if ( + auth == IERC5484Upgradeable.BurnAuth.IssuerOnly || + auth == IERC5484Upgradeable.BurnAuth.Both + ) { + _approve(tokenId, from, amount); + } + } + + function revoke( + uint256 tokenId, + bytes calldata data + ) internal virtual onlyBurner(tokenId) { + _requireMinted(tokenId); + + _revoke(_msgSender(), tokenId, balanceOf(tokenId)); + + data; + } + + function revoke( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) internal virtual onlyBurner(tokenId) { + _requireMinted(tokenId); + + _revoke(_msgSender(), tokenId, amount); + + data; + } + + function locked(uint256 tokenId) internal view virtual returns (bool) { + _requireMinted(tokenId); + + return !LibERC5727Storage.s()._unlocked[tokenId]; + } + + function burnAuth( + uint256 tokenId + ) internal view virtual returns (IERC5484Upgradeable.BurnAuth) { + _requireMinted(tokenId); + + return LibERC5727Storage.s()._burnAuths[tokenId]; + } + + function _checkBurnAuth( + address from, + uint256 tokenId + ) internal view virtual returns (bool) { + return LibERC5727Storage.s()._burnerRole[tokenId][from]; + } + + function _checkMintAuth( + address from, + uint256 slot + ) internal view virtual returns (bool) { + return + (owner() == from) || LibERC5727Storage.s()._minterRole[slot][from]; + } + + function _burn(uint256 tokenId) internal virtual override { + super._burn(tokenId); + + delete LibERC5727Storage.s()._issuers[tokenId]; + delete LibERC5727Storage.s()._verifiers[tokenId]; + delete LibERC5727Storage.s()._burnAuths[tokenId]; + } + + function _revoke(address from, uint256 tokenId) internal virtual { + LibERC5727Storage.s()._revoked[tokenId] = true; + emit Revoked(from, tokenId); + } + + function _revoke( + address from, + uint256 tokenId, + uint256 amount + ) internal virtual { + _burn(tokenId, amount); + + from; + } + + function verify( + uint256 tokenId, + bytes calldata data + ) internal virtual returns (bool result) { + _requireMinted(tokenId); + + // TODO: use actual verifier + result = _verify(_msgSender(), tokenId, data); + + data; + } + + function _verify( + address by, + uint256 tokenId, + bytes memory data + ) internal virtual returns (bool result) { + bytes memory signature = abi.decode(data, (bytes)); + bytes32 digest = _hashTypedDataV4( + keccak256( + abi.encode( + _TOKEN_TYPEHASH, + tokenId, + ownerOf(tokenId), + balanceOf(tokenId), + slotOf(tokenId), + issuerOf(tokenId), + verifierOf(tokenId), + burnAuth(tokenId) + ) + ) + ); + + address issuer = LibERC5727Storage.s()._issuers[tokenId]; + result = issuer.isValidSignatureNow(digest, signature); + + emit Verified(by, tokenId, result); + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + if ( + from != address(0) && + to != address(0) && + !LibERC5727Storage.s()._unlocked[firstTokenId] + ) revert Soulbound(); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + if (from != address(0) && to != address(0)) revert Soulbound(); + + super._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + } +} diff --git a/contracts-modularized/ERC5727/ERC5727DelegateUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727DelegateUpgradeableDS.sol new file mode 100644 index 000000000..cfe37d57c --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727DelegateUpgradeableDS.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./interfaces/IERC5727DelegateUpgradeable.sol"; +import "./ERC5727Core.sol"; +import "./ERC5727Storage.sol"; + +contract ERC5727DelegateUpgradeableDS is + IERC5727DelegateUpgradeable, + ERC5727Core +{ + function __ERC5727Delegate_init() internal onlyInitializing { + __ERC5727Delegate_init_unchained(); + } + + function __ERC5727Delegate_init_unchained() internal onlyInitializing {} + + function delegate( + address operator, + uint256 slot + ) external virtual override onlyAdmin { + if (operator == address(0) || slot == 0) revert NullValue(); + if (isOperatorFor(operator, slot)) + revert RoleAlreadyGranted(operator, "voter"); + + LibERC5727Storage.s()._minterRole[slot][operator] = true; + emit Delegate(operator, slot); + } + + function undelegate( + address operator, + uint256 slot + ) external virtual override onlyAdmin { + if (operator == address(0) || slot == 0) revert NullValue(); + if (!isOperatorFor(operator, slot)) + revert RoleNotGranted(operator, "voter"); + + LibERC5727Storage.s()._minterRole[slot][operator] = false; + emit UnDelegate(operator, slot); + } + + function isOperatorFor( + address operator, + uint256 slot + ) public view virtual override returns (bool) { + if (operator == address(0) || slot == 0) revert NullValue(); + + return LibERC5727Storage.s()._minterRole[slot][operator]; + } +} diff --git a/contracts-modularized/ERC5727/ERC5727EnumerableCore.sol b/contracts-modularized/ERC5727/ERC5727EnumerableCore.sol new file mode 100644 index 000000000..1f4049cab --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727EnumerableCore.sol @@ -0,0 +1,164 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC5727Core.sol"; +import "./interfaces/IERC5727EnumerableUpgradeable.sol"; +import "../ERC3525/ERC3525SlotEnumerableCore.sol"; +import "./ERC5727EnumerableStorage.sol"; + +contract ERC5727EnumerableCore is ERC5727Core, ERC3525SlotEnumerableCore { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + function __ERC5727Enumerable_init() internal onlyInitializing { + __ERC5727Enumerable_init_unchained(); + } + + function __ERC5727Enumerable_init_unchained() internal onlyInitializing {} + + function slotCountOfOwner(address owner) internal view returns (uint256) { + if (owner == address(0)) revert NullValue(); + + return LibERC5727EnumerableStorage.s()._slotsOfOwner[owner].length(); + } + + function slotOfOwnerByIndex( + address owner, + uint256 index + ) internal view returns (uint256) { + if (owner == address(0)) revert NullValue(); + uint256 slotCountByOwner = LibERC5727EnumerableStorage + .s() + ._slotsOfOwner[owner] + .length(); + if (index >= slotCountByOwner) + revert IndexOutOfBounds(index, slotCountByOwner); + + return LibERC5727EnumerableStorage.s()._slotsOfOwner[owner].at(index); + } + + function ownerBalanceInSlot( + address owner, + uint256 slot + ) internal view returns (uint256) { + if (owner == address(0)) revert NullValue(); + if (!_slotExists(slot)) revert NotFound(slot); + + return + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].get( + owner + ); + } + + function _incrementOwnerBalanceInSlot( + address owner, + uint256 slot + ) internal virtual { + if (owner == address(0)) revert NullValue(); + + (, uint256 balanceInSlot) = LibERC5727EnumerableStorage + .s() + ._ownerBalanceInSlot[slot] + .tryGet(owner); + unchecked { + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].set( + owner, + balanceInSlot + 1 + ); + } + } + + function _decrementOwnerBalanceInSlot( + address owner, + uint256 slot + ) internal virtual { + if (owner == address(0)) revert NullValue(); + + uint256 balanceInSlot = LibERC5727EnumerableStorage + .s() + ._ownerBalanceInSlot[slot] + .get(owner); + unchecked { + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].set( + owner, + balanceInSlot - 1 + ); + } + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override(ERC721EnumerableCore, ERC5727Core) { + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + } + + function _burn( + uint256 tokenId + ) internal virtual override(ERC3525Core, ERC5727Core) { + ERC5727Core._burn(tokenId); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override(ERC3525SlotEnumerableCore, ERC5727Core) { + super._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (from == address(0) && fromTokenId == 0) { + _incrementOwnerBalanceInSlot(to, slot); + + LibERC5727EnumerableStorage.s()._slotsOfOwner[to].add(slot); + } + + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override(ERC3525SlotEnumerableCore, ERC3525Core) { + super._afterValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (to == address(0) && toTokenId == 0) { + _decrementOwnerBalanceInSlot(from, slot); + + if ( + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].get( + from + ) == 0 + ) { + LibERC5727EnumerableStorage.s()._slotsOfOwner[from].remove( + slot + ); + } + } + + value; + } +} diff --git a/contracts-modularized/ERC5727/ERC5727EnumerableStorage.sol b/contracts-modularized/ERC5727/ERC5727EnumerableStorage.sol new file mode 100644 index 000000000..cf98c6044 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727EnumerableStorage.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; + +library LibERC5727EnumerableStorage { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc5727Enumerable.storage"); + + struct ERC5727EnumerableStorage { + mapping(address => EnumerableSetUpgradeable.UintSet) _slotsOfOwner; + mapping(uint256 => EnumerableMapUpgradeable.AddressToUintMap) _ownerBalanceInSlot; + } + + function s() internal pure returns (ERC5727EnumerableStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC5727/ERC5727EnumerableUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727EnumerableUpgradeableDS.sol new file mode 100644 index 000000000..4570aac9a --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727EnumerableUpgradeableDS.sol @@ -0,0 +1,167 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC5727Core.sol"; +import "./interfaces/IERC5727EnumerableUpgradeable.sol"; +import "../ERC3525/ERC3525SlotEnumerableCore.sol"; +import "./ERC5727EnumerableStorage.sol"; + +contract ERC5727EnumerableUpgradeableDS is + ERC5727Core, + ERC3525SlotEnumerableCore +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + function __ERC5727Enumerable_init() internal onlyInitializing { + __ERC5727Enumerable_init_unchained(); + } + + function __ERC5727Enumerable_init_unchained() internal onlyInitializing {} + + function slotCountOfOwner(address owner) external view returns (uint256) { + if (owner == address(0)) revert NullValue(); + + return LibERC5727EnumerableStorage.s()._slotsOfOwner[owner].length(); + } + + function slotOfOwnerByIndex( + address owner, + uint256 index + ) external view returns (uint256) { + if (owner == address(0)) revert NullValue(); + uint256 slotCountByOwner = LibERC5727EnumerableStorage + .s() + ._slotsOfOwner[owner] + .length(); + if (index >= slotCountByOwner) + revert IndexOutOfBounds(index, slotCountByOwner); + + return LibERC5727EnumerableStorage.s()._slotsOfOwner[owner].at(index); + } + + function ownerBalanceInSlot( + address owner, + uint256 slot + ) public view returns (uint256) { + if (owner == address(0)) revert NullValue(); + if (!_slotExists(slot)) revert NotFound(slot); + + return + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].get( + owner + ); + } + + function _incrementOwnerBalanceInSlot( + address owner, + uint256 slot + ) internal virtual { + if (owner == address(0)) revert NullValue(); + + (, uint256 balanceInSlot) = LibERC5727EnumerableStorage + .s() + ._ownerBalanceInSlot[slot] + .tryGet(owner); + unchecked { + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].set( + owner, + balanceInSlot + 1 + ); + } + } + + function _decrementOwnerBalanceInSlot( + address owner, + uint256 slot + ) internal virtual { + if (owner == address(0)) revert NullValue(); + + uint256 balanceInSlot = LibERC5727EnumerableStorage + .s() + ._ownerBalanceInSlot[slot] + .get(owner); + unchecked { + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].set( + owner, + balanceInSlot - 1 + ); + } + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override(ERC721EnumerableCore, ERC5727Core) { + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + } + + function _burn( + uint256 tokenId + ) internal virtual override(ERC3525Core, ERC5727Core) { + ERC5727Core._burn(tokenId); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override(ERC3525SlotEnumerableCore, ERC5727Core) { + super._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (from == address(0) && fromTokenId == 0) { + _incrementOwnerBalanceInSlot(to, slot); + + LibERC5727EnumerableStorage.s()._slotsOfOwner[to].add(slot); + } + + value; + } + + function _afterValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override(ERC3525SlotEnumerableCore, ERC3525Core) { + super._afterValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + + if (to == address(0) && toTokenId == 0) { + _decrementOwnerBalanceInSlot(from, slot); + + if ( + LibERC5727EnumerableStorage.s()._ownerBalanceInSlot[slot].get( + from + ) == 0 + ) { + LibERC5727EnumerableStorage.s()._slotsOfOwner[from].remove( + slot + ); + } + } + + value; + } +} diff --git a/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableDS.sol new file mode 100644 index 000000000..b5f51e8d4 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableDS.sol @@ -0,0 +1,96 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC5727Core.sol"; +import "./interfaces/IERC5727ExpirableUpgradeable.sol"; +import "./ERC5727Storage.sol"; +import "./ERC5727ExpirableUpgradeableStorage.sol"; + +contract ERC5727ExpirableUpgradeableDS is + IERC5727ExpirableUpgradeable, + ERC5727Core +{ + modifier onlyManager(uint256 tokenId) { + if ( + _msgSender() != LibERC5727Storage.s()._issuers[tokenId] && + _msgSender() != ownerOf(tokenId) + ) revert Unauthorized(_msgSender()); + _; + } + + function setExpiration( + uint256 tokenId, + uint64 expiration, + bool renewable + ) public virtual override onlyIssuer(tokenId) { + if (!_exists(tokenId)) revert NotFound(tokenId); + if (expiration == 0) revert NullValue(); + if (LibERC5727ExpirableStorage.s()._expiryDate[tokenId] > 0) + revert Conflict(tokenId); + // solhint-disable-next-line not-rely-on-time + if (expiration < block.timestamp) revert PastDate(); + + LibERC5727ExpirableStorage.s()._expiryDate[tokenId] = expiration; + LibERC5727ExpirableStorage.s()._isRenewable[tokenId] = renewable; + + emit SubscriptionUpdate(tokenId, expiration); + } + + function renewSubscription( + uint256 tokenId, + uint64 duration + ) external payable virtual override onlyManager(tokenId) { + if (!_exists(tokenId)) revert NotFound(tokenId); + if (duration == 0) revert NullValue(); + if (!LibERC5727ExpirableStorage.s()._isRenewable[tokenId]) + revert NotRenewable(tokenId); + // solhint-disable-next-line not-rely-on-time + if ( + LibERC5727ExpirableStorage.s()._expiryDate[tokenId] < + block.timestamp + ) revert Expired(tokenId); + + unchecked { + LibERC5727ExpirableStorage.s()._expiryDate[tokenId] += duration; + } + + emit SubscriptionUpdate( + tokenId, + LibERC5727ExpirableStorage.s()._expiryDate[tokenId] + ); + } + + function cancelSubscription( + uint256 tokenId + ) external payable virtual override onlyManager(tokenId) { + if (!_exists(tokenId)) revert NotFound(tokenId); + if (!LibERC5727ExpirableStorage.s()._isRenewable[tokenId]) + revert NotRenewable(tokenId); + // solhint-disable-next-line not-rely-on-time + if ( + LibERC5727ExpirableStorage.s()._expiryDate[tokenId] < + block.timestamp + ) revert Expired(tokenId); + + delete LibERC5727ExpirableStorage.s()._expiryDate[tokenId]; + delete LibERC5727ExpirableStorage.s()._isRenewable[tokenId]; + + emit SubscriptionUpdate(tokenId, 0); + } + + function isRenewable( + uint256 tokenId + ) public view virtual override returns (bool) { + if (!_exists(tokenId)) revert NotFound(tokenId); + return LibERC5727ExpirableStorage.s()._isRenewable[tokenId]; + } + + function expiresAt( + uint256 tokenId + ) public view virtual override returns (uint64) { + if (!_exists(tokenId)) revert NotFound(tokenId); + if (LibERC5727ExpirableStorage.s()._expiryDate[tokenId] == 0) + revert NoExpiration(tokenId); + return LibERC5727ExpirableStorage.s()._expiryDate[tokenId]; + } +} diff --git a/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableStorage.sol b/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableStorage.sol new file mode 100644 index 000000000..f97ff1137 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727ExpirableUpgradeableStorage.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library LibERC5727ExpirableStorage { + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc5727Expirable.storage"); + + struct ERC5727ExpirableStorage { + mapping(uint256 => uint64) _expiryDate; + mapping(uint256 => bool) _isRenewable; + mapping(uint256 => uint64) _slotExpiryDate; + mapping(uint256 => bool) _slotIsRenewable; + } + + function s() internal pure returns (ERC5727ExpirableStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC5727/ERC5727GovernanceStorage.sol b/contracts-modularized/ERC5727/ERC5727GovernanceStorage.sol new file mode 100644 index 000000000..0ed289673 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727GovernanceStorage.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "../ERC5484/interfaces/IERC5484Upgradeable.sol"; +import "./interfaces/IERC5727GovernanceUpgradeable.sol"; + +library LibERC5727GovernanceStorage { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using CountersUpgradeable for CountersUpgradeable.Counter; + using StringsUpgradeable for uint256; + + enum ApprovalStatus { + Pending, + Approved, + Rejected, + Removed + } + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc5727Governance.storage"); + + struct ERC5727GovernanceStorage { + mapping(address => bool) _voterRole; + EnumerableSetUpgradeable.AddressSet _voters; + CountersUpgradeable.Counter _approvalRequestCount; + mapping(uint256 => IERC5727GovernanceUpgradeable.IssueApproval) _approvals; + } + + function s() internal pure returns (ERC5727GovernanceStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC5727/ERC5727GovernanceUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727GovernanceUpgradeableDS.sol new file mode 100644 index 000000000..d18d9eb53 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727GovernanceUpgradeableDS.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./ERC5727Core.sol"; +import "./interfaces/IERC5727GovernanceUpgradeable.sol"; +import "./ERC5727GovernanceStorage.sol"; + +contract ERC5727GovernanceUpgradeableDS is + IERC5727GovernanceUpgradeable, + ERC5727Core +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using CountersUpgradeable for CountersUpgradeable.Counter; + using StringsUpgradeable for uint256; + + modifier onlyVoter() { + if (!isVoter(_msgSender())) revert MethodNotAllowed(_msgSender()); + _; + } + + function init(address admin_) external initializer { + LibERC5727GovernanceStorage.s()._voters.add(admin_); + LibERC5727GovernanceStorage.s()._voterRole[admin_] = true; + } + + function requestApproval( + address to, + uint256 tokenId, + uint256 amount, + uint256 slot, + IERC5484Upgradeable.BurnAuth burnAuth, + address verifier, + bytes calldata data + ) external virtual override onlyVoter { + if (to == address(0) || tokenId == 0 || slot == 0) revert NullValue(); + + uint256 approvalId = LibERC5727GovernanceStorage + .s() + ._approvalRequestCount + .current(); + LibERC5727GovernanceStorage.s()._approvals[approvalId] = IssueApproval( + _msgSender(), + to, + tokenId, + amount, + slot, + 0, + 0, + ApprovalStatus.Pending, + burnAuth, + verifier + ); + + LibERC5727GovernanceStorage.s()._approvalRequestCount.increment(); + + emit ApprovalUpdate(approvalId, _msgSender(), ApprovalStatus.Pending); + + data; + } + + function removeApprovalRequest( + uint256 approvalId + ) external virtual override { + if ( + LibERC5727GovernanceStorage.s()._approvals[approvalId].creator == + address(0) + ) revert NotFound(approvalId); + if ( + _msgSender() != + LibERC5727GovernanceStorage.s()._approvals[approvalId].creator + ) revert Unauthorized(_msgSender()); + if ( + LibERC5727GovernanceStorage + .s() + ._approvals[approvalId] + .approvalStatus != ApprovalStatus.Pending + ) revert Forbidden(); + + LibERC5727GovernanceStorage + .s() + ._approvals[approvalId] + .approvalStatus = ApprovalStatus.Removed; + + emit ApprovalUpdate(approvalId, address(0), ApprovalStatus.Removed); + } + + function addVoter(address newVoter) public virtual onlyAdmin { + if (newVoter == address(0)) revert NullValue(); + if (LibERC5727GovernanceStorage.s()._voterRole[newVoter]) + revert RoleAlreadyGranted(newVoter, "voter"); + + LibERC5727GovernanceStorage.s()._voters.add(newVoter); + LibERC5727GovernanceStorage.s()._voterRole[newVoter] = true; + } + + function removeVoter(address voter) public virtual onlyAdmin { + if (voter == address(0)) revert NullValue(); + if (!LibERC5727GovernanceStorage.s()._voters.contains(voter)) + revert RoleNotGranted(voter, "voter"); + + LibERC5727GovernanceStorage.s()._voterRole[voter] = false; + LibERC5727GovernanceStorage.s()._voters.remove(voter); + } + + function voterCount() public view virtual returns (uint256) { + return LibERC5727GovernanceStorage.s()._voters.length(); + } + + function voterByIndex(uint256 index) public view virtual returns (address) { + if (index >= voterCount()) revert IndexOutOfBounds(index, voterCount()); + + return LibERC5727GovernanceStorage.s()._voters.at(index); + } + + function isVoter(address voter) public view virtual returns (bool) { + return LibERC5727GovernanceStorage.s()._voterRole[voter]; + } + + function voteApproval( + uint256 approvalId, + bool approve, + bytes calldata data + ) external virtual override onlyVoter { + IssueApproval storage approval = LibERC5727GovernanceStorage + .s() + ._approvals[approvalId]; + if (approval.creator == address(0)) revert NotFound(approvalId); + + ApprovalStatus approvalStatus = approval.approvalStatus; + if (approvalStatus != ApprovalStatus.Pending) revert Forbidden(); + + if (approve) { + approval.votersApproved++; + } else { + approval.votersRejected++; + } + + if (approval.votersApproved > voterCount() / 2) { + approval.approvalStatus = ApprovalStatus.Approved; + _issue( + _msgSender(), + approval.to, + approval.tokenId, + approval.slot, + approval.burnAuth, + approval.verifier + ); + _issue(_msgSender(), approval.tokenId, approval.amount); + + emit ApprovalUpdate( + approvalId, + _msgSender(), + ApprovalStatus.Approved + ); + } + if (approval.votersRejected > voterCount() / 2) { + approval.approvalStatus = ApprovalStatus.Rejected; + + emit ApprovalUpdate( + approvalId, + _msgSender(), + ApprovalStatus.Rejected + ); + } + + data; + } + + function getApproval( + uint256 approvalId + ) public view virtual returns (IssueApproval memory) { + if ( + LibERC5727GovernanceStorage.s()._approvals[approvalId].creator == + address(0) + ) revert NotFound(approvalId); + + return LibERC5727GovernanceStorage.s()._approvals[approvalId]; + } + + function approvalURI( + uint256 approvalId + ) public view virtual override returns (string memory) { + if ( + LibERC5727GovernanceStorage.s()._approvals[approvalId].creator == + address(0) + ) revert NotFound(approvalId); + + string memory contractUri = contractURI(); + return + bytes(contractUri).length > 0 + ? string( + abi.encodePacked( + contractUri, + "/approvals/", + approvalId.toString() + ) + ) + : ""; + } +} diff --git a/contracts-modularized/ERC5727/ERC5727RecoveryUpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727RecoveryUpgradeableDS.sol new file mode 100644 index 000000000..3169f76b6 --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727RecoveryUpgradeableDS.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"; + +import "./ERC5727EnumerableCore.sol"; +import "./interfaces/IERC5727RecoveryUpgradeable.sol"; +import "./ERC5727Storage.sol"; + +contract ERC5727RecoveryUpgradeableDS is ERC5727EnumerableCore { + event Recovered(address indexed from, address indexed to); + using ECDSAUpgradeable for bytes32; + + bytes32 private constant _RECOVERY_TYPEHASH = + keccak256("Recovery(address from,address recipient)"); + + function __ERC5727Recovery_init() internal onlyInitializing { + __ERC5727Recovery_init_unchained(); + } + + function __ERC5727Recovery_init_unchained() internal onlyInitializing {} + + function recover(address from, bytes memory signature) public virtual { + if (from == address(0)) revert NullValue(); + address recipient = _msgSender(); + if (from == recipient) revert MethodNotAllowed(recipient); + + bytes32 digest = _hashTypedDataV4( + keccak256(abi.encode(_RECOVERY_TYPEHASH, from, recipient)) + ); + if (digest.recover(signature) != from) revert Forbidden(); + + uint256 balance = balanceOf(from); + for (uint256 i = 0; i < balance; ) { + uint256 tokenId = tokenOfOwnerByIndex(from, i); + + LibERC5727Storage.s()._unlocked[tokenId] = true; + _transfer(from, recipient, tokenId); + LibERC5727Storage.s()._unlocked[tokenId] = false; + + unchecked { + i++; + } + } + + emit Recovered(from, recipient); + } +} diff --git a/contracts-modularized/ERC5727/ERC5727Storage.sol b/contracts-modularized/ERC5727/ERC5727Storage.sol new file mode 100644 index 000000000..357fc086c --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727Storage.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; +import "../ERC5484/interfaces/IERC5484Upgradeable.sol"; + +library LibERC5727Storage { + using AddressUpgradeable for address; + using StringsUpgradeable for address; + using StringsUpgradeable for uint256; + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc5727core.storage"); + + struct ERC5727Storage { + string _baseUri; + mapping(uint256 => address) _issuers; + mapping(uint256 => address) _verifiers; + mapping(uint256 => IERC5484Upgradeable.BurnAuth) _burnAuths; + mapping(uint256 => bool) _unlocked; + mapping(uint256 => address) _slotVerifiers; + mapping(uint256 => IERC5484Upgradeable.BurnAuth) _slotBurnAuths; + mapping(uint256 => mapping(address => bool)) _minterRole; + mapping(uint256 => mapping(address => bool)) _burnerRole; + mapping(uint256 => bool) _revoked; + } + + function s() internal pure returns (ERC5727Storage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC5727/ERC5727UpgradeableDS.sol b/contracts-modularized/ERC5727/ERC5727UpgradeableDS.sol new file mode 100644 index 000000000..f2abb3a3c --- /dev/null +++ b/contracts-modularized/ERC5727/ERC5727UpgradeableDS.sol @@ -0,0 +1,337 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/cryptography/SignatureCheckerUpgradeable.sol"; + +import "../EIP712/EIP712Upgradeable.sol"; +import "../ERC3525/ERC3525UpgradeableDS.sol"; +import "./interfaces/IERC5727MetadataUpgradeable.sol"; +import "./interfaces/IERC5727EnumerableUpgradeable.sol"; +import "../ERC173/ERC173Upgradeable.sol"; +import "./ERC5727Storage.sol"; + +contract ERC5727UpgradeableDS is + ERC173Upgradeable, + EIP712Upgradeable, + ERC3525UpgradeableDS, + IERC5727MetadataUpgradeable +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + using SignatureCheckerUpgradeable for address; + + bytes32 private constant _TOKEN_TYPEHASH = + keccak256( + "Token(uint256 tokenId,address owner,uint256 value,uint256 slot,address issuer,address verifier,BurnAuth burnAuth)" + ); + + modifier onlyAdmin() { + if (owner() != _msgSender()) revert Unauthorized(_msgSender()); + _; + } + + modifier onlyMinter(uint256 slot) { + if (!_checkMintAuth(_msgSender(), slot)) + revert Unauthorized(_msgSender()); + _; + } + + modifier onlyBurner(uint256 tokenId) { + if (!_checkBurnAuth(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + _; + } + + modifier onlyIssuer(uint256 tokenId) { + if (_msgSender() != LibERC5727Storage.s()._issuers[tokenId]) + revert Unauthorized(_msgSender()); + _; + } + + function init( + string memory name_, + string memory symbol_, + string memory baseUri_, + string memory version_ + ) external initializer { + __EIP712_init_unchained(name_, version_); + __ERC721_init_unchained(name_, symbol_, baseUri_); + __ERC3525_init_unchained(18); + __ERC5727_init_unchained(); + } + + function __ERC5727_init_unchained() internal onlyInitializing {} + + function verifierOf( + uint256 tokenId + ) public view virtual override returns (address) { + address verifier = LibERC5727Storage.s()._verifiers[tokenId]; + if (verifier == address(0)) revert NotFound(tokenId); + + return verifier; + } + + function issuerOf( + uint256 tokenId + ) public view virtual override returns (address) { + address issuer = LibERC5727Storage.s()._issuers[tokenId]; + if (issuer == address(0)) revert NotFound(tokenId); + + return issuer; + } + + function issue( + address to, + uint256 tokenId, + uint256 slot, + BurnAuth auth, + address verifier, + bytes calldata data + ) public payable virtual override onlyMinter(slot) { + if (tokenId == 0 || slot == 0 || to == address(0)) revert NullValue(); + + _issue(_msgSender(), to, tokenId, slot, auth, verifier); + + data; + } + + function issue( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) public payable virtual override onlyIssuer(tokenId) { + _requireMinted(tokenId); + + _issue(_msgSender(), tokenId, amount); + + data; + } + + function _issue( + address from, + address to, + uint256 tokenId, + uint256 slot, + BurnAuth auth, + address verifier + ) internal virtual { + _mint(to, tokenId, slot); + + LibERC5727Storage.s()._issuers[tokenId] = from; + LibERC5727Storage.s()._burnAuths[tokenId] = auth; + LibERC5727Storage.s()._verifiers[tokenId] = verifier; + + if (auth == BurnAuth.IssuerOnly || auth == BurnAuth.Both) { + LibERC5727Storage.s()._burnerRole[tokenId][from] = true; + _approve(from, tokenId); + } + if (auth == BurnAuth.OwnerOnly || auth == BurnAuth.Both) { + LibERC5727Storage.s()._burnerRole[tokenId][to] = true; + } + + emit Issued(from, to, tokenId, auth); + emit Locked(tokenId); + + _beforeValueTransfer(address(0), to, 0, tokenId, slot, 0); + _afterValueTransfer(address(0), to, 0, tokenId, slot, 0); + } + + function _issue( + address from, + uint256 tokenId, + uint256 amount + ) internal virtual { + _mint(tokenId, amount); + + BurnAuth auth = LibERC5727Storage.s()._burnAuths[tokenId]; + + if (auth == BurnAuth.IssuerOnly || auth == BurnAuth.Both) { + _approve(tokenId, from, amount); + } + } + + function revoke( + uint256 tokenId, + bytes calldata data + ) public payable virtual override onlyBurner(tokenId) { + _requireMinted(tokenId); + + _revoke(_msgSender(), tokenId); + + data; + } + + function revoke( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) public payable virtual override onlyBurner(tokenId) { + _requireMinted(tokenId); + + _revoke(_msgSender(), tokenId, amount); + + data; + } + + function locked( + uint256 tokenId + ) public view virtual override returns (bool) { + _requireMinted(tokenId); + + return !LibERC5727Storage.s()._unlocked[tokenId]; + } + + function burnAuth( + uint256 tokenId + ) public view virtual override returns (BurnAuth) { + _requireMinted(tokenId); + + return LibERC5727Storage.s()._burnAuths[tokenId]; + } + + function _checkBurnAuth( + address from, + uint256 tokenId + ) internal view virtual returns (bool) { + return LibERC5727Storage.s()._burnerRole[tokenId][from]; + } + + function _checkMintAuth( + address from, + uint256 slot + ) internal view virtual returns (bool) { + return + (owner() == from) || LibERC5727Storage.s()._minterRole[slot][from]; + } + + function hasMintRole( + address from, + uint256 tokenId + ) external view virtual returns (bool) { + return LibERC5727Storage.s()._minterRole[tokenId][from]; + } + + function hasBurnRole( + address from, + uint256 tokenId + ) external view virtual returns (bool) { + return LibERC5727Storage.s()._burnerRole[tokenId][from]; + } + + function _revoke(address from, uint256 tokenId) internal virtual { + LibERC5727Storage.s()._revoked[tokenId] = true; + emit Revoked(from, tokenId); + } + + function isRevoked(uint256 tokenId) public view virtual returns (bool) { + _requireMinted(tokenId); + + return LibERC5727Storage.s()._revoked[tokenId]; + } + + function _revoke( + address from, + uint256 tokenId, + uint256 amount + ) internal virtual { + _burn(tokenId, amount); + + from; + } + + function verify( + uint256 tokenId, + bytes calldata data + ) public virtual override returns (bool result) { + _requireMinted(tokenId); + + // TODO: use actual verifier + result = _verify(_msgSender(), tokenId, data); + + data; + } + + function _verify( + address by, + uint256 tokenId, + bytes memory data + ) internal virtual returns (bool result) { + bytes memory signature = abi.decode(data, (bytes)); + bytes32 digest = _hashTypedDataV4( + keccak256( + abi.encode( + _TOKEN_TYPEHASH, + tokenId, + ownerOf(tokenId), + balanceOf(tokenId), + slotOf(tokenId), + issuerOf(tokenId), + verifierOf(tokenId), + burnAuth(tokenId) + ) + ) + ); + + address issuer = LibERC5727Storage.s()._issuers[tokenId]; + result = issuer.isValidSignatureNow(digest, signature); + + emit Verified(by, tokenId, result); + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + if ( + from != address(0) && + to != address(0) && + !LibERC5727Storage.s()._unlocked[firstTokenId] + ) revert Soulbound(); + + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + } + + function _beforeValueTransfer( + address from, + address to, + uint256 fromTokenId, + uint256 toTokenId, + uint256 slot, + uint256 value + ) internal virtual override { + if (from != address(0) && to != address(0)) revert Soulbound(); + + super._beforeValueTransfer( + from, + to, + fromTokenId, + toTokenId, + slot, + value + ); + } + + function supportsInterface( + bytes4 interfaceId + ) + public + view + virtual + override(IERC165Upgradeable, ERC3525UpgradeableDS) + returns (bool) + { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + return + ds.supportedInterfaces[interfaceId] || + interfaceId == type(IERC5727Upgradeable).interfaceId || + interfaceId == type(IERC5727MetadataUpgradeable).interfaceId || + interfaceId == type(IERC5727EnumerableUpgradeable).interfaceId || + super.supportsInterface(interfaceId); + } +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727ClaimableUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727ClaimableUpgradeable.sol new file mode 100644 index 000000000..ac5106fc3 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727ClaimableUpgradeable.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC5727Upgradeable.sol"; +import "../../ERC5484/interfaces/IERC5484Upgradeable.sol"; + +interface IERC5727ClaimableUpgradeable { + /** + * @notice Emitted when a token is claimed by `to`. + * @param to The new owner of the token + * @param tokenId The token claimed + * @param amount The amount of the token claimed + */ + event Claimed(address indexed to, uint256 indexed tokenId, uint256 amount); + + /** + * @notice Claim the token with `tokenId` and `proof`. + * @dev MUST revert if the proof is invalid. + * @param to The new owner of the token + * @param tokenId The token claimed + * @param amount The amount of the token claimed + * @param slot The slot to claim the token in + * @param burnAuth The burn authorization of the token + * @param data The additional data used to claim the token + * @param proof The proof to claim the token + */ + function claim( + address to, + uint256 tokenId, + uint256 amount, + uint256 slot, + IERC5484Upgradeable.BurnAuth burnAuth, + address verifier, + bytes calldata data, + bytes32[] calldata proof + ) external; +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727DelegateUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727DelegateUpgradeable.sol new file mode 100644 index 000000000..414e90df3 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727DelegateUpgradeable.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC5727Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Delegate Interface + * @dev This extension allows delegation of issuing and revocation of tokens to an operator. + */ +interface IERC5727DelegateUpgradeable { + /** + * @notice Emitted when a token issuance is delegated to an operator. + * @param operator The owner to which the issuing right is delegated + * @param slot The slot to issue the token in + */ + event Delegate(address indexed operator, uint256 indexed slot); + + /** + * @notice Emitted when a token issuance is revoked from an operator. + * @param operator The owner to which the issuing right is delegated + * @param slot The slot to issue the token in + */ + event UnDelegate(address indexed operator, uint256 indexed slot); + + /** + * @notice Delegate rights to `operator` for a slot. + * @dev MUST revert if the caller does not have the right to delegate. + * MUST revert if the `operator` address is the zero address. + * MUST revert if the `slot` is not a valid slot. + * @param operator The owner to which the issuing right is delegated + * @param slot The slot to issue the token in + */ + function delegate(address operator, uint256 slot) external; + + /** + * @notice Revoke rights from `operator` for a slot. + * @dev MUST revert if the caller does not have the right to delegate. + * MUST revert if the `operator` address is the zero address. + * MUST revert if the `slot` is not a valid slot. + * @param operator The owner to which the issuing right is delegated + * @param slot The slot to issue the token in + */ + + function undelegate(address operator, uint256 slot) external; + + /** + * @notice Check if an operator has the permission to issue or revoke tokens in a slot. + * @param operator The operator to check + * @param slot The slot to check + */ + function isOperatorFor( + address operator, + uint256 slot + ) external view returns (bool); +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727EnumerableUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727EnumerableUpgradeable.sol new file mode 100644 index 000000000..555e7fc38 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727EnumerableUpgradeable.sol @@ -0,0 +1,47 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; + +import "../../ERC3525/interfaces/IERC3525SlotEnumerableUpgradeable.sol"; +import "./IERC5727Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Enumerable Interface + * @dev This extension allows querying the tokens of a owner. + */ +interface IERC5727EnumerableUpgradeable is + IERC3525SlotEnumerableUpgradeable, + IERC5727Upgradeable +{ + /** + * @notice Get the number of slots of a owner. + * @param owner The owner whose number of slots is queried for + * @return The number of slots of the `owner` + */ + function slotCountOfOwner(address owner) external view returns (uint256); + + /** + * @notice Get the slot with `index` of the `owner`. + * @dev MUST revert if the `index` exceed the number of slots of the `owner`. + * @param owner The owner whose slot is queried for. + * @param index The index of the slot queried for + * @return The slot is queried for + */ + function slotOfOwnerByIndex( + address owner, + uint256 index + ) external view returns (uint256); + + /** + * @notice Get the balance of a owner in a slot. + * @dev MUST revert if the slot does not exist. + * @param owner The owner whose balance is queried for + * @param slot The slot whose balance is queried for + * @return The balance of the `owner` in the `slot` + */ + function ownerBalanceInSlot( + address owner, + uint256 slot + ) external view returns (uint256); +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727ExpirableUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727ExpirableUpgradeable.sol new file mode 100644 index 000000000..eed716bd8 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727ExpirableUpgradeable.sol @@ -0,0 +1,62 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +/** + * @title ERC5727 Soulbound Token Expirable Interface + * @dev This extension allows soulbound tokens to be expirable and renewable. + */ +interface IERC5727ExpirableUpgradeable { + /** + * @notice Emitted when a subscription expiration changes + * @dev When a subscription is canceled, the expiration value should also be 0. + */ + event SubscriptionUpdate(uint256 indexed tokenId, uint64 expiration); + + /** + * @notice Renews the subscription to an NFT + * @dev Throws if `tokenId` is not a valid NFT + * @param tokenId The NFT to renew the subscription for + * @param duration The number of seconds to extend a subscription for + */ + function renewSubscription( + uint256 tokenId, + uint64 duration + ) external payable; + + /** + * @notice Cancels the subscription of an NFT + * @dev Throws if `tokenId` is not a valid NFT + * @param tokenId The NFT to cancel the subscription for + */ + function cancelSubscription(uint256 tokenId) external payable; + + /** + * @notice Gets the expiration date of a subscription + * @dev Throws if `tokenId` is not a valid NFT + * @param tokenId The NFT to get the expiration date of + * @return The expiration date of the subscription + */ + function expiresAt(uint256 tokenId) external view returns (uint64); + + /** + * @notice Determines whether a subscription can be renewed + * @dev Throws if `tokenId` is not a valid NFT + * @param tokenId The NFT to get the expiration date of + * @return The renewability of a the subscription + */ + function isRenewable(uint256 tokenId) external view returns (bool); + + /** + * @notice Set the expiry date of a token. + * @dev MUST revert if the `tokenId` token does not exist. + * MUST revert if the `date` is in the past. + * @param tokenId The token whose expiry date is set + * @param expiration The expire date to set + * @param isRenewable Whether the token is renewable + */ + function setExpiration( + uint256 tokenId, + uint64 expiration, + bool isRenewable + ) external; +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727GovernanceUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727GovernanceUpgradeable.sol new file mode 100644 index 000000000..2ef315141 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727GovernanceUpgradeable.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC5727Upgradeable.sol"; +import "../../ERC5484/interfaces/IERC5484Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Governance Interface + * @dev This extension allows issuing of tokens by community voting. + */ +interface IERC5727GovernanceUpgradeable { + struct IssueApproval { + address creator; + address to; + uint256 tokenId; + uint256 amount; + uint256 slot; + uint256 votersApproved; + uint256 votersRejected; + ApprovalStatus approvalStatus; + IERC5484Upgradeable.BurnAuth burnAuth; + address verifier; + } + + enum ApprovalStatus { + Pending, + Approved, + Rejected, + Removed + } + + /** + * @notice Emitted when a token issuance approval is changed. + * @param approvalId The id of the approval + * @param creator The creator of the approval, zero address if the approval is removed + * @param status The status of the approval + */ + event ApprovalUpdate( + uint256 indexed approvalId, + address indexed creator, + ApprovalStatus status + ); + + /** + * @notice Emitted when a voter approves an approval. + * @param voter The voter who approves the approval + * @param approvalId The id of the approval + */ + event Approve( + address indexed voter, + uint256 indexed approvalId, + bool approve + ); + + /** + * @notice Create an approval of issuing a token. + * @dev MUST revert if the caller is not a voter. + * MUST revert if the `to` address is the zero address. + * @param to The owner which the token to mint to + * @param tokenId The id of the token to mint + * @param amount The amount of the token to mint + * @param slot The slot of the token to mint + * @param burnAuth The burn authorization of the token to mint + * @param data The additional data used to mint the token + */ + function requestApproval( + address to, + uint256 tokenId, + uint256 amount, + uint256 slot, + IERC5484Upgradeable.BurnAuth burnAuth, + address verifier, + bytes calldata data + ) external; + + /** + * @notice Remove `approvalId` approval request. + * @dev MUST revert if the caller is not the creator of the approval request. + * MUST revert if the approval request is already approved or rejected or non-existent. + * @param approvalId The approval to remove + */ + function removeApprovalRequest(uint256 approvalId) external; + + /** + * @notice Approve `approvalId` approval request. + * @dev MUST revert if the caller is not a voter. + * MUST revert if the approval request is already approved or rejected or non-existent. + * @param approvalId The approval to approve + * @param approve True if the approval is approved, false if the approval is rejected + * @param data The additional data used to approve the approval (e.g. the signature, voting power) + */ + function voteApproval( + uint256 approvalId, + bool approve, + bytes calldata data + ) external; + + /** + * @notice Get the URI of the approval. + * @dev MUST revert if the `approvalId` does not exist. + * @param approvalId The approval whose URI is queried for + * @return The URI of the approval + */ + function approvalURI( + uint256 approvalId + ) external view returns (string memory); +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727MetadataUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727MetadataUpgradeable.sol new file mode 100644 index 000000000..b774f05c0 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727MetadataUpgradeable.sol @@ -0,0 +1,16 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "../../ERC3525/interfaces/IERC3525MetadataUpgradeable.sol"; +import "./IERC5727Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Metadata Interface + * @dev This extension allows querying the metadata of soulbound tokens. + */ +interface IERC5727MetadataUpgradeable is + IERC3525MetadataUpgradeable, + IERC5727Upgradeable +{ + +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727RecoveryUpgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727RecoveryUpgradeable.sol new file mode 100644 index 000000000..b52d86d73 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727RecoveryUpgradeable.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IERC5727Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Recovery Interface + * @dev This extension allows recovering soulbound tokens from an address provided its signature. + */ +interface IERC5727RecoveryUpgradeable is IERC5727Upgradeable { + /** + * @notice Emitted when the tokens of `owner` are recovered. + * @param from The owner whose tokens are recovered + * @param to The new owner of the tokens + */ + event Recovered(address indexed from, address indexed to); + + /** + * @notice Recover the tokens of `owner` with `signature`. + * @dev MUST revert if the signature is invalid. + * @param owner The owner whose tokens are recovered + * @param signature The signature signed by the `owner` + */ + function recover(address owner, bytes memory signature) external; +} diff --git a/contracts-modularized/ERC5727/interfaces/IERC5727Upgradeable.sol b/contracts-modularized/ERC5727/interfaces/IERC5727Upgradeable.sol new file mode 100644 index 000000000..38f550c47 --- /dev/null +++ b/contracts-modularized/ERC5727/interfaces/IERC5727Upgradeable.sol @@ -0,0 +1,115 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "../../ERC3525/interfaces/IERC3525Upgradeable.sol"; +import "../../ERC5192/interfaces/IERC5192Upgradeable.sol"; +import "../../ERC5484/interfaces/IERC5484Upgradeable.sol"; +import "../../ERC4906/interfaces/IERC4906Upgradeable.sol"; + +/** + * @title ERC5727 Soulbound Token Interface + * @dev The core interface of the ERC5727 standard. + */ +interface IERC5727Upgradeable is + IERC3525Upgradeable, + IERC5192Upgradeable, + IERC5484Upgradeable, + IERC4906Upgradeable +{ + /** + * @dev MUST emit when a token is revoked. + * @param from The address of the owner + * @param tokenId The token id + */ + event Revoked(address indexed from, uint256 indexed tokenId); + + /** + * @dev MUST emit when a token is verified. + * @param by The address that initiated the verification + * @param tokenId The token id + * @param result The result of the verification + */ + event Verified(address indexed by, uint256 indexed tokenId, bool result); + + /** + * @notice Get the verifier of a token. + * @dev MUST revert if the `tokenId` does not exist + * @param tokenId the token for which to query the verifier + * @return The address of the verifier of `tokenId` + */ + function verifierOf(uint256 tokenId) external view returns (address); + + /** + * @notice Get the issuer of a token. + * @dev MUST revert if the `tokenId` does not exist + * @param tokenId the token for which to query the issuer + * @return The address of the issuer of `tokenId` + */ + function issuerOf(uint256 tokenId) external view returns (address); + + /** + * @notice Issue a token in a specified slot with certain value and a verifier to an address. + * @dev MUST revert if the `to` address is the zero address. + * MUST revert if the `verifier` address is the zero address. + * @param to The address to issue the token to + * @param tokenId The token id + * @param slot The slot to issue the token in + * @param burnAuth The burn authorization of the token + * @param verifier The address of the verifier + * @param data Additional data used to issue the token + */ + function issue( + address to, + uint256 tokenId, + uint256 slot, + BurnAuth burnAuth, + address verifier, + bytes calldata data + ) external payable; + + /** + * @notice Issue value to a token. + * @dev MUST revert if the `tokenId` does not exist. + * @param tokenId The token id + * @param amount The amount of the token + * @param data The additional data used to issue the value + */ + function issue( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) external payable; + + /** + * @notice Revoke a token from an address. + * @dev MUST revert if the `tokenId` does not exist. + * @param tokenId The token id + * @param data The additional data used to revoke the token + */ + function revoke(uint256 tokenId, bytes calldata data) external payable; + + /** + * @notice Revoke value from a token. + * @dev MUST revert if the `tokenId` does not exist. + * @param tokenId The token id + * @param amount The amount of the token + * @param data The additional data used to revoke the value + */ + function revoke( + uint256 tokenId, + uint256 amount, + bytes calldata data + ) external payable; + + /** + * @notice Verify a token from an address. + * @dev MUST revert if the `by` address is the zero address. + * @param tokenId The token id + * @param data The additional data used to verify the token + * @return A boolean indicating whether the token is verified + */ + function verify( + uint256 tokenId, + bytes calldata data + ) external returns (bool); +} diff --git a/contracts-modularized/ERC721/ERC721Core.sol b/contracts-modularized/ERC721/ERC721Core.sol new file mode 100644 index 000000000..befa83203 --- /dev/null +++ b/contracts-modularized/ERC721/ERC721Core.sol @@ -0,0 +1,541 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; +import "../utils/ContextUpgradeable.sol"; +import "../ERC165/ERC165UpgradeableDS.sol"; +import "./ERC721Storage.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; + +import "../utils/ErrorsUpgradeable.sol"; + +/** + * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including + * the Metadata extension, but not including the Enumerable extension, which is available separately as + * {ERC721Enumerable}. + */ + +contract ERC721Core is ContextUpgradeable { + using AddressUpgradeable for address; + using StringsUpgradeable for uint256; + + /** + * @dev Emitted when `tokenId` token is transferred from `from` to `to`. + */ + event Transfer( + address indexed from, + address indexed to, + uint256 indexed tokenId + ); + + /** + * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. + */ + event Approval( + address indexed owner, + address indexed approved, + uint256 indexed tokenId + ); + + /** + * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. + */ + event ApprovalForAll( + address indexed owner, + address indexed operator, + bool approved + ); + + function balanceOf(address owner) internal view virtual returns (uint256) { + if (owner == address(0)) revert NullValue(); + return LibERC721Storage.s()._balances[owner]; + } + + /** + * @dev See {IERC721-ownerOf}. + */ + function ownerOf(uint256 tokenId) internal view virtual returns (address) { + address owner = _ownerOf(tokenId); + if (owner == address(0)) revert NotFound(tokenId); + return owner; + } + + /** + * @dev See {IERC721Metadata-name}. + */ + function name() internal view virtual returns (string memory) { + return LibERC721Storage.s()._name; + } + + /** + * @dev See {IERC721Metadata-symbol}. + */ + function symbol() internal view virtual returns (string memory) { + return LibERC721Storage.s()._symbol; + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI( + uint256 tokenId + ) internal view virtual returns (string memory) { + _requireMinted(tokenId); + + string memory _tokenURI = LibERC721Storage.s()._tokenURIs[tokenId]; + string memory base = _baseURI(); + + // If there is no base URI, return the token URI. + if (bytes(base).length == 0) { + return _tokenURI; + } + // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). + if (bytes(_tokenURI).length > 0) { + return string(abi.encodePacked(base, _tokenURI)); + } + + return string(abi.encodePacked(base, tokenId.toString())); + } + + /** + * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function _setTokenURI( + uint256 tokenId, + string memory _tokenURI + ) internal virtual { + _requireMinted(tokenId); + LibERC721Storage.s()._tokenURIs[tokenId] = _tokenURI; + } + + /** + * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each + * token will be the concatenation of the `baseURI` and the `tokenId`. Empty + * by default, can be overridden in child contracts. + */ + function _baseURI() internal view virtual returns (string memory) { + return LibERC721Storage.s()._baseUri; + } + + /** + * @dev See {IERC721-approve}. + */ + function approve(address to, uint256 tokenId) internal virtual { + address owner = ERC721Core.ownerOf(tokenId); + if (to == owner) revert MethodNotAllowed(owner); + + if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) + revert Unauthorized(_msgSender()); + + _approve(to, tokenId); + } + + /** + * @dev See {IERC721-getApproved}. + */ + function getApproved( + uint256 tokenId + ) internal view virtual returns (address) { + _requireMinted(tokenId); + + return LibERC721Storage.s()._tokenApprovals[tokenId]; + } + + /** + * @dev See {IERC721-isApprovedForAll}. + */ + function isApprovedForAll( + address owner, + address operator + ) internal view returns (bool) { + return LibERC721Storage.s()._operatorApprovals[owner][operator]; + } + + /** + * @dev See {IERC721-transferFrom}. + */ + function transferFrom( + address from, + address to, + uint256 tokenId + ) internal virtual { + if (!_isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + + _transfer(from, to, tokenId); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom( + address from, + address to, + uint256 tokenId + ) internal virtual { + safeTransferFrom(from, to, tokenId, ""); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom( + address from, + address to, + uint256 tokenId, + bytes memory data + ) internal virtual { + if (!_isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + _safeTransfer(from, to, tokenId, data); + } + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients + * are aware of the ERC721 protocol to prevent tokens from being forever locked. + * + * `data` is additional data, it has no specified format and it is sent in call to `to`. + * + * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. + * implement alternative mechanisms to perform token transfer, such as signature-based. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeTransfer( + address from, + address to, + uint256 tokenId, + bytes memory data + ) internal virtual { + _transfer(from, to, tokenId); + if (!_checkOnERC721Received(from, to, tokenId, data)) + revert BadReceiver(to); + } + + /** + * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist + */ + function _ownerOf(uint256 tokenId) internal view virtual returns (address) { + return LibERC721Storage.s()._owners[tokenId]; + } + + /** + * @dev Returns whether `tokenId` exists. + * + * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. + * + * Tokens start existing when they are minted (`_mint`), + * and stop existing when they are burned (`_burn`). + */ + function _exists(uint256 tokenId) internal view virtual returns (bool) { + return _ownerOf(tokenId) != address(0); + } + + /** + * @dev Returns whether `spender` is allowed to manage `tokenId`. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function _isApprovedOrOwner( + address spender, + uint256 tokenId + ) internal view virtual returns (bool) { + address owner = ERC721Core.ownerOf(tokenId); + return (spender == owner || + isApprovedForAll(owner, spender) || + getApproved(tokenId) == spender); + } + + /** + * @dev Safely mints `tokenId` and transfers it to `to`. + * + * Requirements: + * + * - `tokenId` must not exist. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeMint(address to, uint256 tokenId) internal virtual { + _safeMint(to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeMint( + address to, + uint256 tokenId, + bytes memory data + ) internal virtual { + _mint(to, tokenId); + if (!_checkOnERC721Received(address(0), to, tokenId, data)) + revert BadReceiver(to); + } + + /** + * @dev Mints `tokenId` and transfers it to `to`. + * + * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible + * + * Requirements: + * + * - `tokenId` must not exist. + * - `to` cannot be the zero address. + * + * Emits a {Transfer} event. + */ + function _mint(address to, uint256 tokenId) internal virtual { + if (to == address(0)) revert BadReceiver(to); + if (_exists(tokenId)) revert Conflict(tokenId); + + _beforeTokenTransfer(address(0), to, tokenId, 1); + + // Check that tokenId was not minted by `_beforeTokenTransfer` hook + if (_exists(tokenId)) revert Conflict(tokenId); + + unchecked { + // Will not overflow unless all 2**256 token ids are minted to the same owner. + // Given that tokens are minted one by one, it is impossible in practice that + // this ever happens. Might change if we allow batch minting. + // The ERC fails to describe this case. + LibERC721Storage.s()._balances[to] += 1; + } + + LibERC721Storage.s()._owners[tokenId] = to; + + emit Transfer(address(0), to, tokenId); + + _afterTokenTransfer(address(0), to, tokenId, 1); + } + + /** + * @dev Destroys `tokenId`. + * The approval is cleared when the token is burned. + * This is an internal function that does not check if the sender is authorized to operate on the token. + * + * Requirements: + * + * - `tokenId` must exist. + * + * Emits a {Transfer} event. + */ + function _burn(uint256 tokenId) internal virtual { + address owner = ERC721Core.ownerOf(tokenId); + + _beforeTokenTransfer(owner, address(0), tokenId, 1); + + // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook + owner = ERC721Core.ownerOf(tokenId); + + // Clear approvals + delete LibERC721Storage.s()._tokenApprovals[tokenId]; + + unchecked { + // Cannot overflow, as that would require more tokens to be burned/transferred + // out than the owner initially received through minting and transferring in. + LibERC721Storage.s()._balances[owner] -= 1; + } + delete LibERC721Storage.s()._owners[tokenId]; + + if (bytes(LibERC721Storage.s()._tokenURIs[tokenId]).length != 0) { + delete LibERC721Storage.s()._tokenURIs[tokenId]; + } + + emit Transfer(owner, address(0), tokenId); + + _afterTokenTransfer(owner, address(0), tokenId, 1); + } + + /** + * @dev Transfers `tokenId` from `from` to `to`. + * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * + * Emits a {Transfer} event. + */ + function _transfer( + address from, + address to, + uint256 tokenId + ) internal virtual { + if (ERC721Core.ownerOf(tokenId) != from) revert Unauthorized(from); + if (to == address(0)) revert BadReceiver(to); + + _beforeTokenTransfer(from, to, tokenId, 1); + + // Check that tokenId was not transferred by `_beforeTokenTransfer` hook + if (ERC721Core.ownerOf(tokenId) != from) revert Unauthorized(from); + + // Clear approvals from the previous owner + delete LibERC721Storage.s()._tokenApprovals[tokenId]; + + unchecked { + // `_balances[from]` cannot overflow for the same reason as described in `_burn`: + // `from`'s balance is the number of token held, which is at least one before the current + // transfer. + // `_balances[to]` could overflow in the conditions described in `_mint`. That would require + // all 2**256 token ids to be minted, which in practice is impossible. + LibERC721Storage.s()._balances[from] -= 1; + LibERC721Storage.s()._balances[to] += 1; + } + LibERC721Storage.s()._owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + + _afterTokenTransfer(from, to, tokenId, 1); + } + + /** + * @dev Approve `to` to operate on `tokenId` + * + * Emits an {Approval} event. + */ + function _approve(address to, uint256 tokenId) internal virtual { + LibERC721Storage.s()._tokenApprovals[tokenId] = to; + emit Approval(ERC721Core.ownerOf(tokenId), to, tokenId); + } + + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Emits an {ApprovalForAll} event. + */ + function _setApprovalForAll( + address owner, + address operator, + bool approved + ) internal virtual { + if (owner == operator) revert MethodNotAllowed(owner); + LibERC721Storage.s()._operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + + /** + * @dev Reverts if the `tokenId` has not been minted yet. + */ + function _requireMinted(uint256 tokenId) internal view virtual { + if (tokenId == 0) revert NullValue(); + if (!_exists(tokenId)) revert NotFound(tokenId); + } + + /** + * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. + * The call is not executed if the target address is not a contract. + * + * @param from address representing the previous owner of the given token ID + * @param to target address that will receive the tokens + * @param tokenId uint256 ID of the token to be transferred + * @param data bytes optional data to send along with the call + * @return bool whether the call correctly returned the expected magic value + */ + function _checkOnERC721Received( + address from, + address to, + uint256 tokenId, + bytes memory data + ) private returns (bool) { + if (to.isContract()) { + try + IERC721ReceiverUpgradeable(to).onERC721Received( + _msgSender(), + from, + tokenId, + data + ) + returns (bytes4 retval) { + return + retval == + IERC721ReceiverUpgradeable.onERC721Received.selector; + } catch (bytes memory reason) { + if (reason.length == 0) { + revert BadReceiver(to); + } else { + // solhint-disable-next-line no-inline-assembly + assembly { + revert(add(32, reason), mload(reason)) + } + } + } + } else { + return true; + } + } + + /** + * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. + * + * Calling conditions: + * + * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. + * - When `from` is zero, the tokens will be minted for `to`. + * - When `to` is zero, ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 /* firstTokenId */, + uint256 batchSize + ) internal virtual { + if (batchSize > 1) { + if (from != address(0)) { + LibERC721Storage.s()._balances[from] -= batchSize; + } + if (to != address(0)) { + LibERC721Storage.s()._balances[to] += batchSize; + } + } + } + + /** + * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. + * + * Calling conditions: + * + * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. + * - When `from` is zero, the tokens were minted for `to`. + * - When `to` is zero, ``from``'s tokens were burned. + * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _afterTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual { + from; + to; + firstTokenId; + batchSize; + } +} diff --git a/contracts-modularized/ERC721/ERC721EnumerableCore.sol b/contracts-modularized/ERC721/ERC721EnumerableCore.sol new file mode 100644 index 000000000..0b5670190 --- /dev/null +++ b/contracts-modularized/ERC721/ERC721EnumerableCore.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "./ERC721Storage.sol"; + +import "./ERC721Core.sol"; + +/** + * @dev This implements an optional extension of {ERC721} defined in the EIP that adds + * enumerability of all the token ids in the contract as well as all token ids owned by each + * account. + */ +contract ERC721EnumerableCore is ERC721Core { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + + /** + * @dev See {IERC165-supportsInterface}. + */ + // function supportsInterface( + // bytes4 interfaceId + // ) + // public + // view + // virtual + // override(IERC165Upgradeable, ERC721Upgradeable) + // returns (bool) + // { + // return + // interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || + // super.supportsInterface(interfaceId); + // } + + /** + * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. + */ + function tokenOfOwnerByIndex( + address owner, + uint256 index + ) internal view returns (uint256) { + if (index >= ERC721Core.balanceOf(owner)) + revert IndexOutOfBounds(index, ERC721Core.balanceOf(owner)); + return + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[owner].at( + index + ); + } + + /** + * @dev See {IERC721Enumerable-totalSupply}. + */ + function totalSupply() internal view returns (uint256) { + return LibERC721EnumerableUpgradeableStorage.s()._allTokens.length(); + } + + /** + * @dev See {IERC721Enumerable-tokenByIndex}. + */ + function tokenByIndex(uint256 index) internal view returns (uint256) { + if (index >= ERC721EnumerableCore.totalSupply()) + revert IndexOutOfBounds(index, ERC721EnumerableCore.totalSupply()); + return LibERC721EnumerableUpgradeableStorage.s()._allTokens.at(index); + } + + /** + * @dev See {ERC721-_beforeTokenTransfer}. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + + if (batchSize > 1) { + // Will only trigger during construction. Batch transferring (minting) is not available afterwards. + revert NotSupported(); + } + + uint256 tokenId = firstTokenId; + + if (from == address(0)) { + LibERC721EnumerableUpgradeableStorage.s()._allTokens.add(tokenId); + } else if (from != to) { + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[from].remove( + tokenId + ); + } + if (to != address(0) && balanceOf(to) == 0) { + LibERC721EnumerableUpgradeableStorage.s()._allOwners.add(to); + } + } + + function _afterTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + super._afterTokenTransfer(from, to, firstTokenId, batchSize); + + uint256 tokenId = firstTokenId; + + if (to == address(0)) { + LibERC721EnumerableUpgradeableStorage.s()._allTokens.remove( + tokenId + ); + } else if (to != from) { + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[to].add( + tokenId + ); + } + if (from != address(0) && balanceOf(from) == 0) { + LibERC721EnumerableUpgradeableStorage.s()._allOwners.remove(from); + } + } +} diff --git a/contracts-modularized/ERC721/ERC721EnumerableUpgradeable.sol b/contracts-modularized/ERC721/ERC721EnumerableUpgradeable.sol new file mode 100644 index 000000000..d8a449457 --- /dev/null +++ b/contracts-modularized/ERC721/ERC721EnumerableUpgradeable.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import "./ERC721Storage.sol"; + +import "./ERC721Upgradeable.sol"; + +/** + * @dev This implements an optional extension of {ERC721} defined in the EIP that adds + * enumerability of all the token ids in the contract as well as all token ids owned by each + * account. + */ +abstract contract ERC721EnumerableUpgradeable is + ERC721Upgradeable, + IERC721EnumerableUpgradeable +{ + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + + function __ERC721Enumerable_init() internal onlyInitializing { + __ERC721Enumerable_init_unchained(); + } + + function __ERC721Enumerable_init_unchained() internal onlyInitializing {} + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface( + bytes4 interfaceId + ) + public + view + virtual + override(IERC165Upgradeable, ERC721Upgradeable) + returns (bool) + { + return + interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || + super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. + */ + function tokenOfOwnerByIndex( + address owner, + uint256 index + ) public view virtual override returns (uint256) { + if (index >= ERC721Upgradeable.balanceOf(owner)) + revert IndexOutOfBounds(index, ERC721Upgradeable.balanceOf(owner)); + return + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[owner].at( + index + ); + } + + /** + * @dev See {IERC721Enumerable-totalSupply}. + */ + function totalSupply() public view virtual override returns (uint256) { + return LibERC721EnumerableUpgradeableStorage.s()._allTokens.length(); + } + + /** + * @dev See {IERC721Enumerable-tokenByIndex}. + */ + function tokenByIndex( + uint256 index + ) public view virtual override returns (uint256) { + if (index >= ERC721EnumerableUpgradeable.totalSupply()) + revert IndexOutOfBounds( + index, + ERC721EnumerableUpgradeable.totalSupply() + ); + return LibERC721EnumerableUpgradeableStorage.s()._allTokens.at(index); + } + + /** + * @dev See {ERC721-_beforeTokenTransfer}. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + + if (batchSize > 1) { + // Will only trigger during construction. Batch transferring (minting) is not available afterwards. + revert NotSupported(); + } + + uint256 tokenId = firstTokenId; + + if (from == address(0)) { + LibERC721EnumerableUpgradeableStorage.s()._allTokens.add(tokenId); + } else if (from != to) { + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[from].remove( + tokenId + ); + } + if (to != address(0) && balanceOf(to) == 0) { + LibERC721EnumerableUpgradeableStorage.s()._allOwners.add(to); + } + } + + function _afterTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + super._afterTokenTransfer(from, to, firstTokenId, batchSize); + + uint256 tokenId = firstTokenId; + + if (to == address(0)) { + LibERC721EnumerableUpgradeableStorage.s()._allTokens.remove( + tokenId + ); + } else if (to != from) { + LibERC721EnumerableUpgradeableStorage.s()._ownedTokens[to].add( + tokenId + ); + } + if (from != address(0) && balanceOf(from) == 0) { + LibERC721EnumerableUpgradeableStorage.s()._allOwners.remove(from); + } + } +} diff --git a/contracts-modularized/ERC721/ERC721PausableCore.sol b/contracts-modularized/ERC721/ERC721PausableCore.sol new file mode 100644 index 000000000..0e7c5bf2a --- /dev/null +++ b/contracts-modularized/ERC721/ERC721PausableCore.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) + +pragma solidity ^0.8.0; + +import "../utils/ContextUpgradeable.sol"; +import "../utils/Initializable.sol"; +import "./ERC721Storage.sol"; + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract PausableUpgradeableCore is Initializable, ContextUpgradeable { + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev Initializes the contract in unpaused state. + */ + function __Pausable_init() internal onlyInitializing { + __Pausable_init_unchained(); + } + + function __Pausable_init_unchained() internal onlyInitializing { + LibERC721PausableStorage.s()._paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() internal view returns (bool) { + return LibERC721PausableStorage.s()._paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + require(!paused(), "Pausable: paused"); + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + require(paused(), "Pausable: not paused"); + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + LibERC721PausableStorage.s()._paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + LibERC721PausableStorage.s()._paused = false; + emit Unpaused(_msgSender()); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[49] private __gap; +} diff --git a/contracts-modularized/ERC721/ERC721PausableUpgradeable.sol b/contracts-modularized/ERC721/ERC721PausableUpgradeable.sol new file mode 100644 index 000000000..8cda74f9c --- /dev/null +++ b/contracts-modularized/ERC721/ERC721PausableUpgradeable.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./PausableUpgradeable.sol"; +import "./ERC721Upgradeable.sol"; + +/** + * @dev ERC721 token with pausable token transfers, minting and burning. + * + * Useful for scenarios such as preventing trades until the end of an evaluation + * period, or having an emergency switch for freezing all token transfers in the + * event of a large bug. + */ +abstract contract ERC721PausableUpgradeable is + ERC721Upgradeable, + PausableUpgradeable +{ + function __ERC721Pausable_init() internal onlyInitializing { + __Pausable_init_unchained(); + } + + function __ERC721Pausable_init_unchained() internal onlyInitializing {} + + /** + * @dev See {ERC721-_beforeTokenTransfer}. + * + * Requirements: + * + * - the contract must not be paused. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual override { + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + + require(!paused(), "ERC721Pausable: token transfer while paused"); + } +} diff --git a/contracts-modularized/ERC721/ERC721Storage.sol b/contracts-modularized/ERC721/ERC721Storage.sol new file mode 100644 index 000000000..5498720e8 --- /dev/null +++ b/contracts-modularized/ERC721/ERC721Storage.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; + +library LibERC721Storage { + using AddressUpgradeable for address; + using StringsUpgradeable for uint256; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc721.storage"); + + struct ERC721Storage { + // Optional mapping for token URIs + mapping(uint256 => string) _tokenURIs; + // Token name + string _name; + // Token symbol + string _symbol; + string _baseUri; + // Mapping from token ID to owner address + mapping(uint256 => address) _owners; + // Mapping owner address to token count + mapping(address => uint256) _balances; + // Mapping from token ID to approved address + mapping(uint256 => address) _tokenApprovals; + // Mapping from owner to operator approvals + mapping(address => mapping(address => bool)) _operatorApprovals; + } + + function s() internal pure returns (ERC721Storage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +library LibERC721PausableStorage { + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc721Pausable.storage"); + + struct ERC721PausableStorage { + bool _paused; + } + + function s() internal pure returns (ERC721PausableStorage storage ds) { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} + +library LibERC721EnumerableUpgradeableStorage { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.erc721Enumerable.storage"); + + struct ERC721EnumerableUpgradeableStorage { + // Mapping from owner to list of owned token IDs + mapping(address => EnumerableSetUpgradeable.UintSet) _ownedTokens; + EnumerableSetUpgradeable.UintSet _allTokens; + EnumerableSetUpgradeable.AddressSet _allOwners; + } + + function s() + internal + pure + returns (ERC721EnumerableUpgradeableStorage storage ds) + { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } +} diff --git a/contracts-modularized/ERC721/ERC721Upgradeable.sol b/contracts-modularized/ERC721/ERC721Upgradeable.sol new file mode 100644 index 000000000..2cb64e0c8 --- /dev/null +++ b/contracts-modularized/ERC721/ERC721Upgradeable.sol @@ -0,0 +1,577 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; +import "../utils/ContextUpgradeable.sol"; +import "../ERC165/ERC165UpgradeableDS.sol"; +import "./ERC721Storage.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; + +import "../utils/ErrorsUpgradeable.sol"; + +/** + * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including + * the Metadata extension, but not including the Enumerable extension, which is available separately as + * {ERC721Enumerable}. + */ + +contract ERC721Upgradeable is + ContextUpgradeable, + ERC165Upgradeable, + IERC721Upgradeable, + IERC721MetadataUpgradeable +{ + using AddressUpgradeable for address; + using StringsUpgradeable for uint256; + + /** + * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. + */ + function __ERC721_init( + string memory name_, + string memory symbol_, + string memory baseUri_ + ) internal onlyInitializing { + __ERC721_init_unchained(name_, symbol_, baseUri_); + } + + function __ERC721_init_unchained( + string memory name_, + string memory symbol_, + string memory baseUri_ + ) internal onlyInitializing { + LibERC721Storage.s()._name = name_; + LibERC721Storage.s()._symbol = symbol_; + LibERC721Storage.s()._baseUri = baseUri_; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface( + bytes4 interfaceId + ) + public + view + virtual + override(ERC165Upgradeable, IERC165Upgradeable) + returns (bool) + { + return + interfaceId == type(IERC721Upgradeable).interfaceId || + interfaceId == type(IERC721MetadataUpgradeable).interfaceId || + super.supportsInterface(interfaceId); + } + + /** + * @dev See {IERC721-balanceOf}. + */ + function balanceOf( + address owner + ) public view virtual override returns (uint256) { + if (owner == address(0)) revert NullValue(); + return LibERC721Storage.s()._balances[owner]; + } + + /** + * @dev See {IERC721-ownerOf}. + */ + function ownerOf( + uint256 tokenId + ) public view virtual override returns (address) { + address owner = _ownerOf(tokenId); + if (owner == address(0)) revert NotFound(tokenId); + return owner; + } + + /** + * @dev See {IERC721Metadata-name}. + */ + function name() public view virtual override returns (string memory) { + return LibERC721Storage.s()._name; + } + + /** + * @dev See {IERC721Metadata-symbol}. + */ + function symbol() public view virtual override returns (string memory) { + return LibERC721Storage.s()._symbol; + } + + /** + * @dev See {IERC721Metadata-tokenURI}. + */ + function tokenURI( + uint256 tokenId + ) public view virtual override returns (string memory) { + _requireMinted(tokenId); + + string memory _tokenURI = LibERC721Storage.s()._tokenURIs[tokenId]; + string memory base = _baseURI(); + + // If there is no base URI, return the token URI. + if (bytes(base).length == 0) { + return _tokenURI; + } + // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). + if (bytes(_tokenURI).length > 0) { + return string(abi.encodePacked(base, _tokenURI)); + } + + return string(abi.encodePacked(base, tokenId.toString())); + } + + /** + * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function _setTokenURI( + uint256 tokenId, + string memory _tokenURI + ) internal virtual { + _requireMinted(tokenId); + LibERC721Storage.s()._tokenURIs[tokenId] = _tokenURI; + } + + /** + * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each + * token will be the concatenation of the `baseURI` and the `tokenId`. Empty + * by default, can be overridden in child contracts. + */ + function _baseURI() internal view virtual returns (string memory) { + return LibERC721Storage.s()._baseUri; + } + + /** + * @dev See {IERC721-approve}. + */ + function approve(address to, uint256 tokenId) public virtual override { + address owner = ERC721Upgradeable.ownerOf(tokenId); + if (to == owner) revert MethodNotAllowed(owner); + + if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) + revert Unauthorized(_msgSender()); + + _approve(to, tokenId); + } + + /** + * @dev See {IERC721-getApproved}. + */ + function getApproved( + uint256 tokenId + ) public view virtual override returns (address) { + _requireMinted(tokenId); + + return LibERC721Storage.s()._tokenApprovals[tokenId]; + } + + /** + * @dev See {IERC721-setApprovalForAll}. + */ + function setApprovalForAll( + address operator, + bool approved + ) public virtual override { + _setApprovalForAll(_msgSender(), operator, approved); + } + + /** + * @dev See {IERC721-isApprovedForAll}. + */ + function isApprovedForAll( + address owner, + address operator + ) public view virtual override returns (bool) { + return LibERC721Storage.s()._operatorApprovals[owner][operator]; + } + + /** + * @dev See {IERC721-transferFrom}. + */ + function transferFrom( + address from, + address to, + uint256 tokenId + ) public virtual override { + if (!_isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + + _transfer(from, to, tokenId); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom( + address from, + address to, + uint256 tokenId + ) public virtual override { + safeTransferFrom(from, to, tokenId, ""); + } + + /** + * @dev See {IERC721-safeTransferFrom}. + */ + function safeTransferFrom( + address from, + address to, + uint256 tokenId, + bytes memory data + ) public virtual override { + if (!_isApprovedOrOwner(_msgSender(), tokenId)) + revert Unauthorized(_msgSender()); + _safeTransfer(from, to, tokenId, data); + } + + /** + * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients + * are aware of the ERC721 protocol to prevent tokens from being forever locked. + * + * `data` is additional data, it has no specified format and it is sent in call to `to`. + * + * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. + * implement alternative mechanisms to perform token transfer, such as signature-based. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `tokenId` token must exist and be owned by `from`. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeTransfer( + address from, + address to, + uint256 tokenId, + bytes memory data + ) internal virtual { + _transfer(from, to, tokenId); + if (!_checkOnERC721Received(from, to, tokenId, data)) + revert BadReceiver(to); + } + + /** + * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist + */ + function _ownerOf(uint256 tokenId) internal view virtual returns (address) { + return LibERC721Storage.s()._owners[tokenId]; + } + + /** + * @dev Returns whether `tokenId` exists. + * + * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. + * + * Tokens start existing when they are minted (`_mint`), + * and stop existing when they are burned (`_burn`). + */ + function _exists(uint256 tokenId) internal view virtual returns (bool) { + return _ownerOf(tokenId) != address(0); + } + + /** + * @dev Returns whether `spender` is allowed to manage `tokenId`. + * + * Requirements: + * + * - `tokenId` must exist. + */ + function _isApprovedOrOwner( + address spender, + uint256 tokenId + ) internal view virtual returns (bool) { + address owner = ERC721Upgradeable.ownerOf(tokenId); + return (spender == owner || + isApprovedForAll(owner, spender) || + getApproved(tokenId) == spender); + } + + /** + * @dev Safely mints `tokenId` and transfers it to `to`. + * + * Requirements: + * + * - `tokenId` must not exist. + * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. + * + * Emits a {Transfer} event. + */ + function _safeMint(address to, uint256 tokenId) internal virtual { + _safeMint(to, tokenId, ""); + } + + /** + * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is + * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. + */ + function _safeMint( + address to, + uint256 tokenId, + bytes memory data + ) internal virtual { + _mint(to, tokenId); + if (!_checkOnERC721Received(address(0), to, tokenId, data)) + revert BadReceiver(to); + } + + /** + * @dev Mints `tokenId` and transfers it to `to`. + * + * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible + * + * Requirements: + * + * - `tokenId` must not exist. + * - `to` cannot be the zero address. + * + * Emits a {Transfer} event. + */ + function _mint(address to, uint256 tokenId) internal virtual { + if (to == address(0)) revert BadReceiver(to); + if (_exists(tokenId)) revert Conflict(tokenId); + + _beforeTokenTransfer(address(0), to, tokenId, 1); + + // Check that tokenId was not minted by `_beforeTokenTransfer` hook + if (_exists(tokenId)) revert Conflict(tokenId); + + unchecked { + // Will not overflow unless all 2**256 token ids are minted to the same owner. + // Given that tokens are minted one by one, it is impossible in practice that + // this ever happens. Might change if we allow batch minting. + // The ERC fails to describe this case. + LibERC721Storage.s()._balances[to] += 1; + } + + LibERC721Storage.s()._owners[tokenId] = to; + + emit Transfer(address(0), to, tokenId); + + _afterTokenTransfer(address(0), to, tokenId, 1); + } + + /** + * @dev Destroys `tokenId`. + * The approval is cleared when the token is burned. + * This is an internal function that does not check if the sender is authorized to operate on the token. + * + * Requirements: + * + * - `tokenId` must exist. + * + * Emits a {Transfer} event. + */ + function _burn(uint256 tokenId) internal virtual { + address owner = ERC721Upgradeable.ownerOf(tokenId); + + _beforeTokenTransfer(owner, address(0), tokenId, 1); + + // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook + owner = ERC721Upgradeable.ownerOf(tokenId); + + // Clear approvals + delete LibERC721Storage.s()._tokenApprovals[tokenId]; + + unchecked { + // Cannot overflow, as that would require more tokens to be burned/transferred + // out than the owner initially received through minting and transferring in. + LibERC721Storage.s()._balances[owner] -= 1; + } + delete LibERC721Storage.s()._owners[tokenId]; + + if (bytes(LibERC721Storage.s()._tokenURIs[tokenId]).length != 0) { + delete LibERC721Storage.s()._tokenURIs[tokenId]; + } + + emit Transfer(owner, address(0), tokenId); + + _afterTokenTransfer(owner, address(0), tokenId, 1); + } + + /** + * @dev Transfers `tokenId` from `from` to `to`. + * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - `tokenId` token must be owned by `from`. + * + * Emits a {Transfer} event. + */ + function _transfer( + address from, + address to, + uint256 tokenId + ) internal virtual { + if (ERC721Upgradeable.ownerOf(tokenId) != from) + revert Unauthorized(from); + if (to == address(0)) revert BadReceiver(to); + + _beforeTokenTransfer(from, to, tokenId, 1); + + // Check that tokenId was not transferred by `_beforeTokenTransfer` hook + if (ERC721Upgradeable.ownerOf(tokenId) != from) + revert Unauthorized(from); + + // Clear approvals from the previous owner + delete LibERC721Storage.s()._tokenApprovals[tokenId]; + + unchecked { + // `_balances[from]` cannot overflow for the same reason as described in `_burn`: + // `from`'s balance is the number of token held, which is at least one before the current + // transfer. + // `_balances[to]` could overflow in the conditions described in `_mint`. That would require + // all 2**256 token ids to be minted, which in practice is impossible. + LibERC721Storage.s()._balances[from] -= 1; + LibERC721Storage.s()._balances[to] += 1; + } + LibERC721Storage.s()._owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + + _afterTokenTransfer(from, to, tokenId, 1); + } + + /** + * @dev Approve `to` to operate on `tokenId` + * + * Emits an {Approval} event. + */ + function _approve(address to, uint256 tokenId) internal virtual { + LibERC721Storage.s()._tokenApprovals[tokenId] = to; + emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); + } + + /** + * @dev Approve `operator` to operate on all of `owner` tokens + * + * Emits an {ApprovalForAll} event. + */ + function _setApprovalForAll( + address owner, + address operator, + bool approved + ) internal virtual { + if (owner == operator) revert MethodNotAllowed(owner); + LibERC721Storage.s()._operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + + /** + * @dev Reverts if the `tokenId` has not been minted yet. + */ + function _requireMinted(uint256 tokenId) internal view virtual { + if (tokenId == 0) revert NullValue(); + if (!_exists(tokenId)) revert NotFound(tokenId); + } + + /** + * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. + * The call is not executed if the target address is not a contract. + * + * @param from address representing the previous owner of the given token ID + * @param to target address that will receive the tokens + * @param tokenId uint256 ID of the token to be transferred + * @param data bytes optional data to send along with the call + * @return bool whether the call correctly returned the expected magic value + */ + function _checkOnERC721Received( + address from, + address to, + uint256 tokenId, + bytes memory data + ) private returns (bool) { + if (to.isContract()) { + try + IERC721ReceiverUpgradeable(to).onERC721Received( + _msgSender(), + from, + tokenId, + data + ) + returns (bytes4 retval) { + return + retval == + IERC721ReceiverUpgradeable.onERC721Received.selector; + } catch (bytes memory reason) { + if (reason.length == 0) { + revert BadReceiver(to); + } else { + // solhint-disable-next-line no-inline-assembly + assembly { + revert(add(32, reason), mload(reason)) + } + } + } + } else { + return true; + } + } + + /** + * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. + * + * Calling conditions: + * + * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. + * - When `from` is zero, the tokens will be minted for `to`. + * - When `to` is zero, ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 /* firstTokenId */, + uint256 batchSize + ) internal virtual { + if (batchSize > 1) { + if (from != address(0)) { + LibERC721Storage.s()._balances[from] -= batchSize; + } + if (to != address(0)) { + LibERC721Storage.s()._balances[to] += batchSize; + } + } + } + + /** + * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. + * + * Calling conditions: + * + * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. + * - When `from` is zero, the tokens were minted for `to`. + * - When `to` is zero, ``from``'s tokens were burned. + * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _afterTokenTransfer( + address from, + address to, + uint256 firstTokenId, + uint256 batchSize + ) internal virtual { + from; + to; + firstTokenId; + batchSize; + } +} diff --git a/contracts-modularized/ERC721/PausableUpgradeable.sol b/contracts-modularized/ERC721/PausableUpgradeable.sol new file mode 100644 index 000000000..36a1cafdf --- /dev/null +++ b/contracts-modularized/ERC721/PausableUpgradeable.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) + +pragma solidity ^0.8.0; + +import "../utils/ContextUpgradeable.sol"; +import "../utils/Initializable.sol"; +import "./ERC721Storage.sol"; + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev Initializes the contract in unpaused state. + */ + function __Pausable_init() internal onlyInitializing { + __Pausable_init_unchained(); + } + + function __Pausable_init_unchained() internal onlyInitializing { + LibERC721PausableStorage.s()._paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() public view virtual returns (bool) { + return LibERC721PausableStorage.s()._paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + require(!paused(), "Pausable: paused"); + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + require(paused(), "Pausable: not paused"); + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + LibERC721PausableStorage.s()._paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + LibERC721PausableStorage.s()._paused = false; + emit Unpaused(_msgSender()); + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[49] private __gap; +} diff --git a/contracts-modularized/README.md b/contracts-modularized/README.md new file mode 100644 index 000000000..c2df17eb3 --- /dev/null +++ b/contracts-modularized/README.md @@ -0,0 +1,91 @@ +## Contract modularized + +### Deploy + +#### init contract + +DiamondInit contract reusable accross upgrades, and can be used for multiple diamonds. + +```js +const diamondMultiInitFactory: DiamondMultiInit__factory = await ethers.getContractFactory( + 'DiamondMultiInit', +); +const diamondMultiInit = await diamondMultiInitFactory.deploy(); +console.log('diamondInit deployed: ', diamondMultiInit.address); +``` + +#### facets + +```js +const FacetNames = [ + 'DiamondCutFacet', + 'DiamondLoupeFacet', + 'ERC5727UpgradeableDS', + 'ERC5727ClaimableUpgradeableDS', + 'ERC5727GovernanceUpgradeableDS', + 'ERC5727RecoveryUpgradeableDS', + 'ERC5727ExpirableUpgradeableDS', + 'ERC5727EnumerableUpgradeableDS', + 'ERC5727DelegateUpgradeableDS', +]; +for (const FacetName of FacetNames) { + const Facet = await ethers.getContractFactory(FacetName); + const facet = await Facet.deploy(); + await facet.deployed(); + console.log(`${FacetName} deployed: ${facet.address}`); +} +``` + +#### diamond + +Deploying Diamond requires two parameters: diamondArgs and facetCuts. + +diamondArgs + +```js +// Setting arguments that will be used in the diamond constructor +const diamondArgs = { + owner: admin.address, + init: diamondMultiInit.address, + initCalldata: functionCall, // init function call +}; +``` + +facetCuts + +```js +for (const FacetName of FacetNames) { + const Facet = await ethers.getContractFactory(FacetName); + const facet = await Facet.deploy(); + await facet.deployed(); + console.log(`${FacetName} deployed: ${facet.address}`); + if (facetCuts.length === 0) { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: getSelectors(facet), + }); + } else { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: remove( + getSelectors(facet), + facetCuts[facetCuts.length - 1].functionSelectors, + ), // Removing existing function signatures. + }); + } +} +``` + +```js +const Diamond = await ethers.getContractFactory('Diamond'); +const diamond = await Diamond.deploy(facetCuts, diamondArgs); +``` + +### Add or remove facet + +```js +const diamondCutFacet = DiamondCutFacet__factory.connect(diamond.address, admin); +await diamondCutFacet.diamondCut(facetCuts, diamondArgs); +``` diff --git a/contracts-modularized/core/SoulHubModularized.sol b/contracts-modularized/core/SoulHubModularized.sol new file mode 100644 index 000000000..b9002046f --- /dev/null +++ b/contracts-modularized/core/SoulHubModularized.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableMapUpgradeable.sol"; + +import "../../contracts-upgradeable/ERC721/ERC721EnumerableUpgradeable.sol"; +import "../diamond/Diamond.sol"; + +contract SoulHubModularized is ERC721EnumerableUpgradeable { + using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; + + event OrganizationCreated( + address indexed creator, + address indexed organization + ); + event MemberAdded(address indexed organization, address indexed member); + event MemberRemoved(address indexed organization, address indexed member); + + mapping(uint256 => address) private _organizations; + mapping(address => EnumerableMapUpgradeable.AddressToUintMap) + private _members; + + function __SoulHub_init() public initializer { + __ERC721_init_unchained("SoulHub", "SOUL"); + __SoulHub_init_unchained(); + } + + function __SoulHub_init_unchained() internal onlyInitializing {} + + function _baseURI() internal view virtual override returns (string memory) { + return "https://soulhub.dev/"; + } + + function tokenURI( + uint256 tokenId + ) public view virtual override returns (string memory) { + _requireMinted(tokenId); + + return + string( + abi.encodePacked( + _baseURI(), + "contracts/", + organizationOf(tokenId) + ) + ); + } + + function createOrganization( + IDiamondCut.FacetCut[] memory _diamondCut, + DiamondArgs memory _args + ) external payable returns (address) { + Diamond diamond = new Diamond(_diamondCut, _args); + emit OrganizationCreated(_msgSender(), address(diamond)); + + uint256 nextId = totalSupply() + 1; + _organizations[nextId] = address(diamond); + _members[address(diamond)].set(_msgSender(), nextId); + _safeMint(_msgSender(), nextId); + + return address(diamond); + } + + function organizationOf(uint256 tokenId) public view returns (address) { + _requireMinted(tokenId); + + return _organizations[tokenId]; + } + + function isMemberOf( + address organization, + address member + ) public view returns (bool) { + return _members[organization].get(member) > 0; + } + + function tokenOfMember( + address organization, + address member + ) public view returns (uint256) { + return _members[organization].get(member); + } + + function getMembers( + address organization + ) external view returns (address[] memory) { + uint256 length = _members[organization].length(); + address[] memory members = new address[](length); + for (uint256 i = 0; i < length; i++) { + (address member, ) = _members[organization].at(i); + members[i] = member; + } + return members; + } + + function addMember(address organization, address member) external { + require( + isMemberOf(organization, _msgSender()), + "SoulHub: Not a member" + ); + require( + AccessControlUpgradeable(organization).hasRole(0x00, _msgSender()), + "SoulHub: Not an admin of organization" + ); + + uint256 nextId = totalSupply() + 1; + _members[organization].set(member, nextId); + _organizations[nextId] = organization; + _safeMint(_msgSender(), nextId); + + emit MemberAdded(organization, member); + } + + function removeMember(address organization, address member) external { + require( + isMemberOf(organization, _msgSender()), + "SoulHub: Not a member" + ); + require( + AccessControlUpgradeable(organization).hasRole(0x00, _msgSender()), + "SoulHub: Not an admin of organization" + ); + + uint256 tokenId = tokenOfMember(organization, member); + _members[organization].remove(member); + _burn(tokenId); + + emit MemberRemoved(organization, member); + } +} diff --git a/contracts-modularized/diamond/Diamond.sol b/contracts-modularized/diamond/Diamond.sol new file mode 100644 index 000000000..cfecebf93 --- /dev/null +++ b/contracts-modularized/diamond/Diamond.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +* +* Implementation of a diamond. +/******************************************************************************/ + +import {LibDiamond} from "./libraries/LibDiamond.sol"; +import {IDiamondCut} from "./interfaces/IDiamondCut.sol"; +import {IDiamondLoupe} from "./interfaces/IDiamondLoupe.sol"; +import {IERC173} from "../ERC173/interfaces/IERC173.sol"; +import {IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; + +// When no function exists for function called +error FunctionNotFound(bytes4 _functionSelector); + +// This is used in diamond constructor +// more arguments are added to this struct +// this avoids stack too deep errors +struct DiamondArgs { + address owner; + address init; + bytes initCalldata; +} + +contract Diamond { + constructor( + IDiamondCut.FacetCut[] memory _diamondCut, + DiamondArgs memory _args + ) payable { + LibDiamond.setContractOwner(_args.owner); + LibDiamond.diamondCut(_diamondCut, _args.init, _args.initCalldata); + + // Code can be added here to perform actions and set state variables. + } + + // Find facet for function that is called and execute the + // function if a facet is found and return any value. + fallback() external payable { + LibDiamond.DiamondStorage storage ds; + bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION; + // get diamond storage + assembly { + ds.slot := position + } + // get facet from function selector + address facet = ds + .facetAddressAndSelectorPosition[msg.sig] + .facetAddress; + if (facet == address(0)) { + revert FunctionNotFound(msg.sig); + } + // Execute external function from facet using delegatecall and return any value. + assembly { + // copy function selector and any arguments + calldatacopy(0, 0, calldatasize()) + // execute function call using the facet + let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + // get any return value + returndatacopy(0, 0, returndatasize()) + // return any return value or error back to the caller + switch result + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + receive() external payable {} +} diff --git a/contracts-modularized/diamond/facets/DiamondCutFacet.sol b/contracts-modularized/diamond/facets/DiamondCutFacet.sol new file mode 100644 index 000000000..276aeee0e --- /dev/null +++ b/contracts-modularized/diamond/facets/DiamondCutFacet.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; +import {LibDiamond} from "../libraries/LibDiamond.sol"; + +// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. +// The loupe functions are required by the EIP2535 Diamonds standard + +contract DiamondCutFacet is IDiamondCut { + /// @notice Add/replace/remove any number of functions and optionally execute + /// a function with delegatecall + /// @param _diamondCut Contains the facet addresses and function selectors + /// @param _init The address of the contract or facet to execute _calldata + /// @param _calldata A function call, including function selector and arguments + /// _calldata is executed with delegatecall on _init + function diamondCut( + FacetCut[] calldata _diamondCut, + address _init, + bytes calldata _calldata + ) external override { + LibDiamond.enforceIsContractOwner(); + LibDiamond.diamondCut(_diamondCut, _init, _calldata); + } +} diff --git a/contracts-modularized/diamond/facets/DiamondLoupeFacet.sol b/contracts-modularized/diamond/facets/DiamondLoupeFacet.sol new file mode 100644 index 000000000..371b84658 --- /dev/null +++ b/contracts-modularized/diamond/facets/DiamondLoupeFacet.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +// The functions in DiamondLoupeFacet MUST be added to a diamond. +// The EIP-2535 Diamond standard requires these functions. + +import {LibDiamond} from "../libraries/LibDiamond.sol"; +import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; +import {IERC165} from "../interfaces/IERC165.sol"; + +contract DiamondLoupeFacet is IDiamondLoupe, IERC165 { + // Diamond Loupe Functions + //////////////////////////////////////////////////////////////////// + /// These functions are expected to be called frequently by tools. + // + // struct Facet { + // address facetAddress; + // bytes4[] functionSelectors; + // } + /// @notice Gets all facets and their selectors. + /// @return facets_ Facet + function facets() external view override returns (Facet[] memory facets_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + uint256 selectorCount = ds.selectors.length; + // create an array set to the maximum size possible + facets_ = new Facet[](selectorCount); + // create an array for counting the number of selectors for each facet + uint16[] memory numFacetSelectors = new uint16[](selectorCount); + // total number of facets + uint256 numFacets; + // loop through function selectors + for ( + uint256 selectorIndex; + selectorIndex < selectorCount; + selectorIndex++ + ) { + bytes4 selector = ds.selectors[selectorIndex]; + address facetAddress_ = ds + .facetAddressAndSelectorPosition[selector] + .facetAddress; + bool continueLoop = false; + // find the functionSelectors array for selector and add selector to it + for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { + if (facets_[facetIndex].facetAddress == facetAddress_) { + facets_[facetIndex].functionSelectors[ + numFacetSelectors[facetIndex] + ] = selector; + numFacetSelectors[facetIndex]++; + continueLoop = true; + break; + } + } + // if functionSelectors array exists for selector then continue loop + if (continueLoop) { + continueLoop = false; + continue; + } + // create a new functionSelectors array for selector + facets_[numFacets].facetAddress = facetAddress_; + facets_[numFacets].functionSelectors = new bytes4[](selectorCount); + facets_[numFacets].functionSelectors[0] = selector; + numFacetSelectors[numFacets] = 1; + numFacets++; + } + for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { + uint256 numSelectors = numFacetSelectors[facetIndex]; + bytes4[] memory selectors = facets_[facetIndex].functionSelectors; + // setting the number of selectors + assembly { + mstore(selectors, numSelectors) + } + } + // setting the number of facets + assembly { + mstore(facets_, numFacets) + } + } + + /// @notice Gets all the function selectors supported by a specific facet. + /// @param _facet The facet address. + /// @return _facetFunctionSelectors The selectors associated with a facet address. + function facetFunctionSelectors( + address _facet + ) external view override returns (bytes4[] memory _facetFunctionSelectors) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + uint256 selectorCount = ds.selectors.length; + uint256 numSelectors; + _facetFunctionSelectors = new bytes4[](selectorCount); + // loop through function selectors + for ( + uint256 selectorIndex; + selectorIndex < selectorCount; + selectorIndex++ + ) { + bytes4 selector = ds.selectors[selectorIndex]; + address facetAddress_ = ds + .facetAddressAndSelectorPosition[selector] + .facetAddress; + if (_facet == facetAddress_) { + _facetFunctionSelectors[numSelectors] = selector; + numSelectors++; + } + } + // Set the number of selectors in the array + assembly { + mstore(_facetFunctionSelectors, numSelectors) + } + } + + /// @notice Get all the facet addresses used by a diamond. + /// @return facetAddresses_ + function facetAddresses() + external + view + override + returns (address[] memory facetAddresses_) + { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + uint256 selectorCount = ds.selectors.length; + // create an array set to the maximum size possible + facetAddresses_ = new address[](selectorCount); + uint256 numFacets; + // loop through function selectors + for ( + uint256 selectorIndex; + selectorIndex < selectorCount; + selectorIndex++ + ) { + bytes4 selector = ds.selectors[selectorIndex]; + address facetAddress_ = ds + .facetAddressAndSelectorPosition[selector] + .facetAddress; + bool continueLoop = false; + // see if we have collected the address already and break out of loop if we have + for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) { + if (facetAddress_ == facetAddresses_[facetIndex]) { + continueLoop = true; + break; + } + } + // continue loop if we already have the address + if (continueLoop) { + continueLoop = false; + continue; + } + // include address + facetAddresses_[numFacets] = facetAddress_; + numFacets++; + } + // Set the number of facet addresses in the array + assembly { + mstore(facetAddresses_, numFacets) + } + } + + /// @notice Gets the facet address that supports the given selector. + /// @dev If facet is not found return address(0). + /// @param _functionSelector The function selector. + /// @return facetAddress_ The facet address. + function facetAddress( + bytes4 _functionSelector + ) external view override returns (address facetAddress_) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + facetAddress_ = ds + .facetAddressAndSelectorPosition[_functionSelector] + .facetAddress; + } + + // This implements ERC-165. + function supportsInterface( + bytes4 _interfaceId + ) external view override returns (bool) { + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + return ds.supportedInterfaces[_interfaceId]; + } +} diff --git a/contracts-modularized/diamond/facets/OwnershipFacet.sol b/contracts-modularized/diamond/facets/OwnershipFacet.sol new file mode 100644 index 000000000..63aa2bf6e --- /dev/null +++ b/contracts-modularized/diamond/facets/OwnershipFacet.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {LibDiamond} from "../libraries/LibDiamond.sol"; +import {IERC173} from "../../ERC173/interfaces/IERC173.sol"; + +contract OwnershipFacet is IERC173 { + function transferOwnership(address _newOwner) external override { + LibDiamond.enforceIsContractOwner(); + LibDiamond.setContractOwner(_newOwner); + } + + function owner() external view override returns (address owner_) { + owner_ = LibDiamond.contractOwner(); + } +} diff --git a/contracts-modularized/diamond/initializers/DiamondInit.sol b/contracts-modularized/diamond/initializers/DiamondInit.sol new file mode 100644 index 000000000..ae8d6abc7 --- /dev/null +++ b/contracts-modularized/diamond/initializers/DiamondInit.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +* +* Implementation of a diamond. +/******************************************************************************/ + +import {LibDiamond} from "../libraries/LibDiamond.sol"; +import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; +import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; +import {IERC173} from "../../ERC173/interfaces/IERC173.sol"; +import {IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"; + +// It is expected that this contract is customized if you want to deploy your diamond +// with data from a deployment script. Use the init function to initialize state variables +// of your diamond. Add parameters to the init funciton if you need to. + +// Adding parameters to the `init` or other functions you add here can make a single deployed +// DiamondInit contract reusable accross upgrades, and can be used for multiple diamonds. + +contract DiamondInit { + // You can add parameters to this function in order to pass in + // data to set your own state variables + function init() external { + // adding ERC165 data + LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); + ds.supportedInterfaces[type(IERC165Upgradeable).interfaceId] = true; + ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; + ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; + ds.supportedInterfaces[type(IERC173).interfaceId] = true; + + // add your own state variables + // EIP-2535 specifies that the `diamondCut` function takes two optional + // arguments: address _init and bytes calldata _calldata + // These arguments are used to execute an arbitrary function using delegatecall + // in order to set state variables in the diamond during deployment or an upgrade + // More info here: https://eips.ethereum.org/EIPS/eip-2535#diamond-interface + } +} diff --git a/contracts-modularized/diamond/initializers/DiamondMultiInit.sol b/contracts-modularized/diamond/initializers/DiamondMultiInit.sol new file mode 100644 index 000000000..e290878b6 --- /dev/null +++ b/contracts-modularized/diamond/initializers/DiamondMultiInit.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +* +* Implementation of a diamond. +/******************************************************************************/ + +import {LibDiamond} from "../libraries/LibDiamond.sol"; + +error AddressAndCalldataLengthDoNotMatch( + uint256 _addressesLength, + uint256 _calldataLength +); + +// This Solidity library is deployed because it contains an external function. +// This is deployed as a Solidity library instead of as regular contract because deployed Solidity libraries +// cannot be deleted. If this was a contract then someone could call multiInit directly on the contract +// with a regular external function call in order to delegatecall (via LibDiamond.initializeDiamondCut) +// to a function that executes self destruct. + +library DiamondMultiInit { + // This function is provided in the third parameter of the `diamondCut` function. + // The `diamondCut` function executes this function to execute multiple initializer functions for a single upgrade. + + function multiInit( + address[] calldata _addresses, + bytes[] calldata _calldata + ) external { + if (_addresses.length != _calldata.length) { + revert AddressAndCalldataLengthDoNotMatch( + _addresses.length, + _calldata.length + ); + } + for (uint i; i < _addresses.length; i++) { + LibDiamond.initializeDiamondCut(_addresses[i], _calldata[i]); + } + } +} diff --git a/contracts-modularized/diamond/interfaces/IDiamond.sol b/contracts-modularized/diamond/interfaces/IDiamond.sol new file mode 100644 index 000000000..bd844ea64 --- /dev/null +++ b/contracts-modularized/diamond/interfaces/IDiamond.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +interface IDiamond { + enum FacetCutAction { + Add, + Replace, + Remove + } + // Add=0, Replace=1, Remove=2 + + struct FacetCut { + address facetAddress; + FacetCutAction action; + bytes4[] functionSelectors; + } + + event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); +} diff --git a/contracts-modularized/diamond/interfaces/IDiamondCut.sol b/contracts-modularized/diamond/interfaces/IDiamondCut.sol new file mode 100644 index 000000000..87cac9ac8 --- /dev/null +++ b/contracts-modularized/diamond/interfaces/IDiamondCut.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +import {IDiamond} from "./IDiamond.sol"; + +interface IDiamondCut is IDiamond { + /// @notice Add/replace/remove any number of functions and optionally execute + /// a function with delegatecall + /// @param _diamondCut Contains the facet addresses and function selectors + /// @param _init The address of the contract or facet to execute _calldata + /// @param _calldata A function call, including function selector and arguments + /// _calldata is executed with delegatecall on _init + function diamondCut( + FacetCut[] calldata _diamondCut, + address _init, + bytes calldata _calldata + ) external; +} diff --git a/contracts-modularized/diamond/interfaces/IDiamondLoupe.sol b/contracts-modularized/diamond/interfaces/IDiamondLoupe.sol new file mode 100644 index 000000000..5e26d621d --- /dev/null +++ b/contracts-modularized/diamond/interfaces/IDiamondLoupe.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ + +// A loupe is a small magnifying glass used to look at diamonds. +// These functions look at diamonds +interface IDiamondLoupe { + /// These functions are expected to be called frequently + /// by tools. + + struct Facet { + address facetAddress; + bytes4[] functionSelectors; + } + + /// @notice Gets all facet addresses and their four byte function selectors. + /// @return facets_ Facet + function facets() external view returns (Facet[] memory facets_); + + /// @notice Gets all the function selectors supported by a specific facet. + /// @param _facet The facet address. + /// @return facetFunctionSelectors_ + function facetFunctionSelectors( + address _facet + ) external view returns (bytes4[] memory facetFunctionSelectors_); + + /// @notice Get all the facet addresses used by a diamond. + /// @return facetAddresses_ + function facetAddresses() + external + view + returns (address[] memory facetAddresses_); + + /// @notice Gets the facet that supports the given selector. + /// @dev If facet is not found return address(0). + /// @param _functionSelector The function selector. + /// @return facetAddress_ The facet address. + function facetAddress( + bytes4 _functionSelector + ) external view returns (address facetAddress_); +} diff --git a/contracts-modularized/diamond/interfaces/IERC165.sol b/contracts-modularized/diamond/interfaces/IERC165.sol new file mode 100644 index 000000000..04b7bcc9a --- /dev/null +++ b/contracts-modularized/diamond/interfaces/IERC165.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IERC165 { + /// @notice Query if a contract implements an interface + /// @param interfaceId The interface identifier, as specified in ERC-165 + /// @dev Interface identification is specified in ERC-165. This function + /// uses less than 30,000 gas. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} diff --git a/contracts-modularized/diamond/libraries/LibDiamond.sol b/contracts-modularized/diamond/libraries/LibDiamond.sol new file mode 100644 index 000000000..5263d5bcb --- /dev/null +++ b/contracts-modularized/diamond/libraries/LibDiamond.sol @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/******************************************************************************\ +* Author: Nick Mudge (https://twitter.com/mudgen) +* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 +/******************************************************************************/ +import {IDiamond} from "../interfaces/IDiamond.sol"; +import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; + +// Remember to add the loupe functions from DiamondLoupeFacet to the diamond. +// The loupe functions are required by the EIP2535 Diamonds standard + +error NoSelectorsGivenToAdd(); +error NotContractOwner(address _user, address _contractOwner); +error NoSelectorsProvidedForFacetForCut(address _facetAddress); +error CannotAddSelectorsToZeroAddress(bytes4[] _selectors); +error NoBytecodeAtAddress(address _contractAddress, string _message); +error IncorrectFacetCutAction(uint8 _action); +error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector); +error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors); +error CannotReplaceImmutableFunction(bytes4 _selector); +error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet( + bytes4 _selector +); +error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector); +error RemoveFacetAddressMustBeZeroAddress(address _facetAddress); +error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector); +error CannotRemoveImmutableFunction(bytes4 _selector); +error InitializationFunctionReverted( + address _initializationContractAddress, + bytes _calldata +); + +library LibDiamond { + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.standard.diamond.storage"); + + struct FacetAddressAndSelectorPosition { + address facetAddress; + uint16 selectorPosition; + } + + struct DiamondStorage { + // function selector => facet address and selector position in selectors array + mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition; + bytes4[] selectors; + mapping(bytes4 => bool) supportedInterfaces; + // owner of the contract + address contractOwner; + } + + function diamondStorage() + internal + pure + returns (DiamondStorage storage ds) + { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } + + event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner + ); + + function setContractOwner(address _newOwner) internal { + DiamondStorage storage ds = diamondStorage(); + address previousOwner = ds.contractOwner; + ds.contractOwner = _newOwner; + emit OwnershipTransferred(previousOwner, _newOwner); + } + + function contractOwner() internal view returns (address contractOwner_) { + contractOwner_ = diamondStorage().contractOwner; + } + + function enforceIsContractOwner() internal view { + if (msg.sender != diamondStorage().contractOwner) { + revert NotContractOwner(msg.sender, diamondStorage().contractOwner); + } + } + + event DiamondCut( + IDiamondCut.FacetCut[] _diamondCut, + address _init, + bytes _calldata + ); + + // Internal function version of diamondCut + function diamondCut( + IDiamondCut.FacetCut[] memory _diamondCut, + address _init, + bytes memory _calldata + ) internal { + for ( + uint256 facetIndex; + facetIndex < _diamondCut.length; + facetIndex++ + ) { + bytes4[] memory functionSelectors = _diamondCut[facetIndex] + .functionSelectors; + address facetAddress = _diamondCut[facetIndex].facetAddress; + if (functionSelectors.length == 0) { + revert NoSelectorsProvidedForFacetForCut(facetAddress); + } + IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action; + if (action == IDiamond.FacetCutAction.Add) { + addFunctions(facetAddress, functionSelectors); + } else if (action == IDiamond.FacetCutAction.Replace) { + replaceFunctions(facetAddress, functionSelectors); + } else if (action == IDiamond.FacetCutAction.Remove) { + removeFunctions(facetAddress, functionSelectors); + } else { + revert IncorrectFacetCutAction(uint8(action)); + } + } + emit DiamondCut(_diamondCut, _init, _calldata); + initializeDiamondCut(_init, _calldata); + } + + function addFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + if (_facetAddress == address(0)) { + revert CannotAddSelectorsToZeroAddress(_functionSelectors); + } + DiamondStorage storage ds = diamondStorage(); + uint16 selectorCount = uint16(ds.selectors.length); + enforceHasContractCode( + _facetAddress, + "LibDiamondCut: Add facet has no code" + ); + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds + .facetAddressAndSelectorPosition[selector] + .facetAddress; + if (oldFacetAddress != address(0)) { + revert CannotAddFunctionToDiamondThatAlreadyExists(selector); + } + ds.facetAddressAndSelectorPosition[ + selector + ] = FacetAddressAndSelectorPosition(_facetAddress, selectorCount); + ds.selectors.push(selector); + selectorCount++; + } + } + + function replaceFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + DiamondStorage storage ds = diamondStorage(); + if (_facetAddress == address(0)) { + revert CannotReplaceFunctionsFromFacetWithZeroAddress( + _functionSelectors + ); + } + enforceHasContractCode( + _facetAddress, + "LibDiamondCut: Replace facet has no code" + ); + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds + .facetAddressAndSelectorPosition[selector] + .facetAddress; + // can't replace immutable functions -- functions defined directly in the diamond in this case + if (oldFacetAddress == address(this)) { + revert CannotReplaceImmutableFunction(selector); + } + if (oldFacetAddress == _facetAddress) { + revert CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet( + selector + ); + } + if (oldFacetAddress == address(0)) { + revert CannotReplaceFunctionThatDoesNotExists(selector); + } + // replace old facet address + ds + .facetAddressAndSelectorPosition[selector] + .facetAddress = _facetAddress; + } + } + + function removeFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + DiamondStorage storage ds = diamondStorage(); + uint256 selectorCount = ds.selectors.length; + if (_facetAddress != address(0)) { + revert RemoveFacetAddressMustBeZeroAddress(_facetAddress); + } + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + FacetAddressAndSelectorPosition + memory oldFacetAddressAndSelectorPosition = ds + .facetAddressAndSelectorPosition[selector]; + if (oldFacetAddressAndSelectorPosition.facetAddress == address(0)) { + revert CannotRemoveFunctionThatDoesNotExist(selector); + } + + // can't remove immutable functions -- functions defined directly in the diamond + if ( + oldFacetAddressAndSelectorPosition.facetAddress == address(this) + ) { + revert CannotRemoveImmutableFunction(selector); + } + // replace selector with last selector + selectorCount--; + if ( + oldFacetAddressAndSelectorPosition.selectorPosition != + selectorCount + ) { + bytes4 lastSelector = ds.selectors[selectorCount]; + ds.selectors[ + oldFacetAddressAndSelectorPosition.selectorPosition + ] = lastSelector; + ds + .facetAddressAndSelectorPosition[lastSelector] + .selectorPosition = oldFacetAddressAndSelectorPosition + .selectorPosition; + } + // delete last selector + ds.selectors.pop(); + delete ds.facetAddressAndSelectorPosition[selector]; + } + } + + function initializeDiamondCut( + address _init, + bytes memory _calldata + ) internal { + if (_init == address(0)) { + return; + } + enforceHasContractCode( + _init, + "LibDiamondCut: _init address has no code" + ); + (bool success, bytes memory error) = _init.delegatecall(_calldata); + if (!success) { + if (error.length > 0) { + // bubble up error + /// @solidity memory-safe-assembly + assembly { + let returndata_size := mload(error) + revert(add(32, error), returndata_size) + } + } else { + revert InitializationFunctionReverted(_init, _calldata); + } + } + } + + function enforceHasContractCode( + address _contract, + string memory _errorMessage + ) internal view { + uint256 contractSize; + assembly { + contractSize := extcodesize(_contract) + } + if (contractSize == 0) { + revert NoBytecodeAtAddress(_contract, _errorMessage); + } + } +} diff --git a/contracts-modularized/package.json b/contracts-modularized/package.json new file mode 100644 index 000000000..4dfcbf6b3 --- /dev/null +++ b/contracts-modularized/package.json @@ -0,0 +1,21 @@ +{ + "name": "@desoul-labs/soulhub-contracts-upgradeable", + "version": "0.2.1-alpha.1", + "description": "SoulHub Contracts", + "homepage": "https://github.com/desoul-labs/soulhub-contracts#readme", + "bugs": { + "url": "https://github.com/desoul-labs/soulhub-contracts/issues" + }, + "repository": { + "type": "git", + "url": "git+git@github.com:desoul-labs/soulhub-contracts.git" + }, + "author": "Austin Zhu", + "files": [ + "**/*.sol", + "README.md" + ], + "publishConfig": { + "@desoul-labs:registry": "https://npm.pkg.github.com" + } +} diff --git a/contracts-modularized/proxy/BeaconProxy.sol b/contracts-modularized/proxy/BeaconProxy.sol new file mode 100644 index 000000000..23d0a2be6 --- /dev/null +++ b/contracts-modularized/proxy/BeaconProxy.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; +import "@openzeppelin/contracts/proxy/Proxy.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol"; + +/** + * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. + * + * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't + * conflict with the storage layout of the implementation behind the proxy. + * + * _Available since v3.4._ + */ +contract BeaconProxy is Proxy, ERC1967Upgrade { + /** + * @dev Initializes the proxy with `beacon`. + * + * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This + * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity + * constructor. + * + * Requirements: + * + * - `beacon` must be a contract with the interface {IBeacon}. + */ + constructor(address beacon, bytes memory data) payable { + _upgradeBeaconToAndCall(beacon, data, false); + } + + /** + * @dev Returns the current beacon address. + */ + function _beacon() internal view virtual returns (address) { + return _getBeacon(); + } + + /** + * @dev Returns the current implementation address of the associated beacon. + */ + function _implementation() + internal + view + virtual + override + returns (address) + { + return IBeacon(_getBeacon()).implementation(); + } + + /** + * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. + * + * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. + * + * Requirements: + * + * - `beacon` must be a contract. + * - The implementation returned by `beacon` must be a contract. + */ + function _setBeacon(address beacon, bytes memory data) internal virtual { + _upgradeBeaconToAndCall(beacon, data, false); + } +} diff --git a/contracts-modularized/proxy/DiamondProxy.sol b/contracts-modularized/proxy/DiamondProxy.sol new file mode 100644 index 000000000..e99d74c0c --- /dev/null +++ b/contracts-modularized/proxy/DiamondProxy.sol @@ -0,0 +1,368 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./interfaces/IDiamondCut.sol"; +import "./interfaces/IDiamondLoupe.sol"; +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract DiamondProxy is Ownable, IDiamond { + // more arguments are added to this struct + // this avoids stack too deep errors + struct DiamondArgs { + address owner; + } + + constructor( + IDiamondCut.FacetCut[] memory _diamondCuts, + DiamondArgs memory _args + ) payable { + _diamondCut(_diamondCuts, address(0), new bytes(0)); + transferOwnership(_args.owner); + + DiamondStorage storage ds = _diamondStorage(); + + // adding ERC165 data + ds.supportedInterfaces[type(IERC165).interfaceId] = true; + ds.supportedInterfaces[type(IDiamondCut).interfaceId] = true; + ds.supportedInterfaces[type(IDiamondLoupe).interfaceId] = true; + ds.supportedInterfaces[type(Ownable).interfaceId] = true; + } + + // Find facet for function that is called and execute the + // function if a facet is found and return any value. + fallback() external payable { + DiamondStorage storage ds; + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress; + require(facet != address(0), "Diamond: Function does not exist"); + assembly { + calldatacopy(0, 0, calldatasize()) + let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) + returndatacopy(0, 0, returndatasize()) + switch result + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + receive() external payable {} + + bytes32 constant DIAMOND_STORAGE_POSITION = + keccak256("diamond.standard.diamond.storage"); + + struct FacetAddressAndPosition { + address facetAddress; + uint16 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array + } + + struct FacetFunctionSelectors { + bytes4[] functionSelectors; + uint16 facetAddressPosition; // position of facetAddress in facetAddresses array + } + + struct DiamondStorage { + // maps function selector to the facet address and + // the position of the selector in the facetFunctionSelectors.selectors array + mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition; + // maps facet addresses to function selectors + mapping(address => FacetFunctionSelectors) facetFunctionSelectors; + // facet addresses + address[] facetAddresses; + // Used to query if a contract implements an interface. + // Used to implement ERC-165. + mapping(bytes4 => bool) supportedInterfaces; + // owner of the contract + address contractOwner; + } + + function _diamondStorage() + internal + pure + returns (DiamondStorage storage ds) + { + bytes32 position = DIAMOND_STORAGE_POSITION; + assembly { + ds.slot := position + } + } + + // Internal function version of diamondCut + function _diamondCut( + IDiamondCut.FacetCut[] memory _diamondCut, + address _init, + bytes memory _calldata + ) internal { + for ( + uint256 facetIndex; + facetIndex < _diamondCut.length; + facetIndex++ + ) { + IDiamond.FacetCutAction action = _diamondCut[facetIndex].action; + if (action == IDiamond.FacetCutAction.Add) { + _addFunctions( + _diamondCut[facetIndex].facetAddress, + _diamondCut[facetIndex].functionSelectors + ); + } else if (action == IDiamond.FacetCutAction.Replace) { + _replaceFunctions( + _diamondCut[facetIndex].facetAddress, + _diamondCut[facetIndex].functionSelectors + ); + } else if (action == IDiamond.FacetCutAction.Remove) { + _removeFunctions( + _diamondCut[facetIndex].facetAddress, + _diamondCut[facetIndex].functionSelectors + ); + } else { + revert("DiamondProxy: Incorrect FacetCutAction"); + } + } + emit DiamondCut(_diamondCut, _init, _calldata); + _initializeDiamondCut(_init, _calldata); + } + + function _addFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + require( + _functionSelectors.length > 0, + "DiamondProxy: No selectors in facet to cut" + ); + DiamondStorage storage ds = _diamondStorage(); + // uint16 selectorCount = uint16(diamondStorage().selectors.length); + require( + _facetAddress != address(0), + "DiamondProxy: Add facet can't be address(0)" + ); + uint16 selectorPosition = uint16( + ds.facetFunctionSelectors[_facetAddress].functionSelectors.length + ); + // add new facet address if it does not exist + if (selectorPosition == 0) { + _enforceHasContractCode( + _facetAddress, + "DiamondProxy: New facet has no code" + ); + ds + .facetFunctionSelectors[_facetAddress] + .facetAddressPosition = uint16(ds.facetAddresses.length); + ds.facetAddresses.push(_facetAddress); + } + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds + .selectorToFacetAndPosition[selector] + .facetAddress; + require( + oldFacetAddress == address(0), + "DiamondProxy: Can't add function that already exists" + ); + ds.facetFunctionSelectors[_facetAddress].functionSelectors.push( + selector + ); + ds + .selectorToFacetAndPosition[selector] + .facetAddress = _facetAddress; + ds + .selectorToFacetAndPosition[selector] + .functionSelectorPosition = selectorPosition; + selectorPosition++; + } + } + + function _replaceFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + require( + _functionSelectors.length > 0, + "DiamondProxy: No selectors in facet to cut" + ); + DiamondStorage storage ds = _diamondStorage(); + require( + _facetAddress != address(0), + "DiamondProxy: Add facet can't be address(0)" + ); + uint16 selectorPosition = uint16( + ds.facetFunctionSelectors[_facetAddress].functionSelectors.length + ); + // add new facet address if it does not exist + if (selectorPosition == 0) { + _enforceHasContractCode( + _facetAddress, + "DiamondProxy: New facet has no code" + ); + ds + .facetFunctionSelectors[_facetAddress] + .facetAddressPosition = uint16(ds.facetAddresses.length); + ds.facetAddresses.push(_facetAddress); + } + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds + .selectorToFacetAndPosition[selector] + .facetAddress; + require( + oldFacetAddress != _facetAddress, + "DiamondProxy: Can't replace function with same function" + ); + _removeFunction(oldFacetAddress, selector); + // add function + ds + .selectorToFacetAndPosition[selector] + .functionSelectorPosition = selectorPosition; + ds.facetFunctionSelectors[_facetAddress].functionSelectors.push( + selector + ); + ds + .selectorToFacetAndPosition[selector] + .facetAddress = _facetAddress; + selectorPosition++; + } + } + + function _removeFunctions( + address _facetAddress, + bytes4[] memory _functionSelectors + ) internal { + require( + _functionSelectors.length > 0, + "DiamondProxy: No selectors in facet to cut" + ); + DiamondStorage storage ds = _diamondStorage(); + // if function does not exist then do nothing and return + require( + _facetAddress == address(0), + "DiamondProxy: Remove facet address must be address(0)" + ); + for ( + uint256 selectorIndex; + selectorIndex < _functionSelectors.length; + selectorIndex++ + ) { + bytes4 selector = _functionSelectors[selectorIndex]; + address oldFacetAddress = ds + .selectorToFacetAndPosition[selector] + .facetAddress; + _removeFunction(oldFacetAddress, selector); + } + } + + function _removeFunction(address _facetAddress, bytes4 _selector) internal { + DiamondStorage storage ds = _diamondStorage(); + require( + _facetAddress != address(0), + "DiamondProxy: Can't remove function that doesn't exist" + ); + // an immutable function is a function defined directly in a diamond + require( + _facetAddress != address(this), + "DiamondProxy: Can't remove immutable function" + ); + // replace selector with last selector, then delete last selector + uint256 selectorPosition = ds + .selectorToFacetAndPosition[_selector] + .functionSelectorPosition; + uint256 lastSelectorPosition = ds + .facetFunctionSelectors[_facetAddress] + .functionSelectors + .length - 1; + // if not the same then replace _selector with lastSelector + if (selectorPosition != lastSelectorPosition) { + bytes4 lastSelector = ds + .facetFunctionSelectors[_facetAddress] + .functionSelectors[lastSelectorPosition]; + ds.facetFunctionSelectors[_facetAddress].functionSelectors[ + selectorPosition + ] = lastSelector; + ds + .selectorToFacetAndPosition[lastSelector] + .functionSelectorPosition = uint16(selectorPosition); + } + // delete the last selector + ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); + delete ds.selectorToFacetAndPosition[_selector]; + + // if no more selectors for facet address then delete the facet address + if (lastSelectorPosition == 0) { + // replace facet address with last facet address and delete last facet address + uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1; + uint256 facetAddressPosition = ds + .facetFunctionSelectors[_facetAddress] + .facetAddressPosition; + if (facetAddressPosition != lastFacetAddressPosition) { + address lastFacetAddress = ds.facetAddresses[ + lastFacetAddressPosition + ]; + ds.facetAddresses[facetAddressPosition] = lastFacetAddress; + ds + .facetFunctionSelectors[lastFacetAddress] + .facetAddressPosition = uint16(facetAddressPosition); + } + ds.facetAddresses.pop(); + delete ds + .facetFunctionSelectors[_facetAddress] + .facetAddressPosition; + } + } + + function _initializeDiamondCut( + address _init, + bytes memory _calldata + ) internal { + if (_init == address(0)) { + require( + _calldata.length == 0, + "DiamondProxy: _init is address(0) but_calldata is not empty" + ); + } else { + require( + _calldata.length > 0, + "DiamondProxy: _calldata is empty but _init is not address(0)" + ); + if (_init != address(this)) { + _enforceHasContractCode( + _init, + "DiamondProxy: _init address has no code" + ); + } + (bool success, bytes memory error) = _init.delegatecall(_calldata); + if (!success) { + if (error.length > 0) { + // bubble up the error + revert(string(error)); + } else { + revert("DiamondProxy: _init function reverted"); + } + } + } + } + + function _enforceHasContractCode( + address _contract, + string memory _errorMessage + ) internal view { + uint256 contractSize; + assembly { + contractSize := extcodesize(_contract) + } + require(contractSize > 0, _errorMessage); + } +} diff --git a/contracts-modularized/proxy/MinimalProxyFactory.sol b/contracts-modularized/proxy/MinimalProxyFactory.sol new file mode 100644 index 000000000..dfbaf526d --- /dev/null +++ b/contracts-modularized/proxy/MinimalProxyFactory.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.11; + +import "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; +import "@openzeppelin/contracts/metatx/ERC2771Context.sol"; +import "@openzeppelin/contracts/utils/Create2.sol"; +import "@openzeppelin/contracts/utils/Multicall.sol"; +import "@openzeppelin/contracts/proxy/Clones.sol"; + +contract MinimalProxyFactory is Multicall, ERC2771Context { + /// @dev Emitted when a proxy is deployed. + event ProxyDeployed( + address indexed implementation, + address proxy, + address indexed deployer + ); + + /// @dev mapping of proxy address to deployer address + mapping(address => address) public deployer; + + constructor(address _trustedForwarder) ERC2771Context(_trustedForwarder) {} + + /// @dev Deploys a proxy that points to the given implementation. + function deployProxyByImplementation( + address _implementation, + bytes memory _data, + bytes32 _salt + ) external returns (address deployedProxy) { + bytes32 salthash = keccak256(abi.encodePacked(_msgSender(), _salt)); + deployedProxy = Clones.cloneDeterministic(_implementation, salthash); + + deployer[deployedProxy] = _msgSender(); + + emit ProxyDeployed(_implementation, deployedProxy, _msgSender()); + + if (_data.length > 0) { + // slither-disable-next-line unused-return + Address.functionCall(deployedProxy, _data); + } + } + + function calculateProxyAddressByImplementation( + address _implementation, + bytes32 _salt + ) external view returns (address) { + bytes32 salthash = keccak256(abi.encodePacked(_msgSender(), _salt)); + return Clones.predictDeterministicAddress(_implementation, salthash); + } +} diff --git a/contracts-modularized/proxy/TransparentUpgradeableProxy.sol b/contracts-modularized/proxy/TransparentUpgradeableProxy.sol new file mode 100644 index 000000000..ef49f8731 --- /dev/null +++ b/contracts-modularized/proxy/TransparentUpgradeableProxy.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +/** + * @dev This contract implements a proxy that is upgradeable by an admin. + * + * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector + * clashing], which can potentially be used in an attack, this contract uses the + * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two + * things that go hand in hand: + * + * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if + * that call matches one of the admin functions exposed by the proxy itself. + * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the + * implementation. If the admin tries to call a function on the implementation it will fail with an error that says + * "admin cannot fallback to proxy target". + * + * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing + * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due + * to sudden errors when trying to call a function from the proxy implementation. + * + * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, + * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. + */ +contract TransparentUpgradeableProxy is ERC1967Proxy { + /** + * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and + * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. + */ + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable ERC1967Proxy(_logic, _data) { + _changeAdmin(admin_); + } + + /** + * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. + */ + modifier ifAdmin() { + if (msg.sender == _getAdmin()) { + _; + } else { + _fallback(); + } + } + + /** + * @dev Returns the current admin. + * + * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` + */ + function admin() external payable ifAdmin returns (address admin_) { + _requireZeroValue(); + admin_ = _getAdmin(); + } + + /** + * @dev Returns the current implementation. + * + * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. + * + * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the + * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. + * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` + */ + function implementation() + external + payable + ifAdmin + returns (address implementation_) + { + _requireZeroValue(); + implementation_ = _implementation(); + } + + /** + * @dev Changes the admin of the proxy. + * + * Emits an {AdminChanged} event. + * + * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}. + */ + function changeAdmin(address newAdmin) external payable virtual ifAdmin { + _requireZeroValue(); + _changeAdmin(newAdmin); + } + + /** + * @dev Upgrade the implementation of the proxy. + * + * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}. + */ + function upgradeTo(address newImplementation) external payable ifAdmin { + _requireZeroValue(); + _upgradeToAndCall(newImplementation, bytes(""), false); + } + + /** + * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified + * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the + * proxied contract. + * + * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}. + */ + function upgradeToAndCall( + address newImplementation, + bytes calldata data + ) external payable ifAdmin { + _upgradeToAndCall(newImplementation, data, true); + } + + /** + * @dev Returns the current admin. + */ + function _admin() internal view virtual returns (address) { + return _getAdmin(); + } + + /** + * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}. + */ + function _beforeFallback() internal virtual override { + require( + msg.sender != _getAdmin(), + "TransparentUpgradeableProxy: admin cannot fallback to proxy target" + ); + super._beforeFallback(); + } + + /** + * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to + * emulate some proxy functions being non-payable while still allowing value to pass through. + */ + function _requireZeroValue() private { + require(msg.value == 0); + } +} diff --git a/contracts-modularized/proxy/UpgradeableBeacon.sol b/contracts-modularized/proxy/UpgradeableBeacon.sol new file mode 100644 index 000000000..688c2654d --- /dev/null +++ b/contracts-modularized/proxy/UpgradeableBeacon.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; + +/** + * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their + * implementation contract, which is where they will delegate all function calls. + * + * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. + */ +contract UpgradeableBeacon is IBeacon, Ownable { + address private _implementation; + + /** + * @dev Emitted when the implementation returned by the beacon is changed. + */ + event Upgraded(address indexed implementation); + + /** + * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the + * beacon. + */ + constructor(address implementation_) { + _setImplementation(implementation_); + } + + /** + * @dev Returns the current implementation address. + */ + function implementation() public view virtual override returns (address) { + return _implementation; + } + + /** + * @dev Upgrades the beacon to a new implementation. + * + * Emits an {Upgraded} event. + * + * Requirements: + * + * - msg.sender must be the owner of the contract. + * - `newImplementation` must be a contract. + */ + function upgradeTo(address newImplementation) public virtual onlyOwner { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation contract address for this beacon + * + * Requirements: + * + * - `newImplementation` must be a contract. + */ + function _setImplementation(address newImplementation) private { + require( + Address.isContract(newImplementation), + "UpgradeableBeacon: implementation is not a contract" + ); + _implementation = newImplementation; + } +} diff --git a/contracts-modularized/proxy/interfaces/IDiamond.sol b/contracts-modularized/proxy/interfaces/IDiamond.sol new file mode 100644 index 000000000..3030e2daf --- /dev/null +++ b/contracts-modularized/proxy/interfaces/IDiamond.sol @@ -0,0 +1,19 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +interface IDiamond { + enum FacetCutAction { + Add, + Replace, + Remove + } + // Add=0, Replace=1, Remove=2 + + struct FacetCut { + address facetAddress; + FacetCutAction action; + bytes4[] functionSelectors; + } + + event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); +} diff --git a/contracts-modularized/proxy/interfaces/IDiamondCut.sol b/contracts-modularized/proxy/interfaces/IDiamondCut.sol new file mode 100644 index 000000000..faeb63a32 --- /dev/null +++ b/contracts-modularized/proxy/interfaces/IDiamondCut.sol @@ -0,0 +1,18 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "./IDiamond.sol"; + +interface IDiamondCut is IDiamond { + /// @notice Add/replace/remove any number of functions and optionally execute + /// a function with delegatecall + /// @param _diamondCut Contains the facet addresses and function selectors + /// @param _init The address of the contract or facet to execute _calldata + /// @param _calldata A function call, including function selector and arguments + /// _calldata is executed with delegatecall on _init + function diamondCut( + FacetCut[] calldata _diamondCut, + address _init, + bytes calldata _calldata + ) external; +} diff --git a/contracts-modularized/proxy/interfaces/IDiamondLoupe.sol b/contracts-modularized/proxy/interfaces/IDiamondLoupe.sol new file mode 100644 index 000000000..a01dcce60 --- /dev/null +++ b/contracts-modularized/proxy/interfaces/IDiamondLoupe.sol @@ -0,0 +1,37 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +// A loupe is a small magnifying glass used to look at diamonds. +// These functions look at diamonds +interface IDiamondLoupe { + struct Facet { + address facetAddress; + bytes4[] functionSelectors; + } + + /// @notice Gets all facet addresses and their four byte function selectors. + /// @return facets_ Facet + function facets() external view returns (Facet[] memory facets_); + + /// @notice Gets all the function selectors supported by a specific facet. + /// @param _facet The facet address. + /// @return facetFunctionSelectors_ + function facetFunctionSelectors( + address _facet + ) external view returns (bytes4[] memory facetFunctionSelectors_); + + /// @notice Get all the facet addresses used by a diamond. + /// @return facetAddresses_ + function facetAddresses() + external + view + returns (address[] memory facetAddresses_); + + /// @notice Gets the facet that supports the given selector. + /// @dev If facet is not found return address(0). + /// @param _functionSelector The function selector. + /// @return facetAddress_ The facet address. + function facetAddress( + bytes4 _functionSelector + ) external view returns (address facetAddress_); +} diff --git a/contracts-modularized/utils/ContextUpgradeable.sol b/contracts-modularized/utils/ContextUpgradeable.sol new file mode 100644 index 000000000..ef63469b8 --- /dev/null +++ b/contracts-modularized/utils/ContextUpgradeable.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Context.sol) + +pragma solidity ^0.8.0; +import "../utils/Initializable.sol"; + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract ContextUpgradeable is Initializable { + function __Context_init() internal onlyInitializing {} + + function __Context_init_unchained() internal onlyInitializing {} + + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[50] private __gap; +} diff --git a/contracts-modularized/utils/ErrorsUpgradeable.sol b/contracts-modularized/utils/ErrorsUpgradeable.sol new file mode 100644 index 000000000..2d8160545 --- /dev/null +++ b/contracts-modularized/utils/ErrorsUpgradeable.sol @@ -0,0 +1,50 @@ +//SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +error Unauthorized(address from); + +error MethodNotAllowed(address from); + +error NotFound(uint256 id); + +error Conflict(uint256 id); + +error Soulbound(); + +error BadReceiver(address to); + +error Forbidden(); + +error IndexOutOfBounds(uint256 index, uint256 length); + +error NullValue(); + +error NotSupported(); + +error Mismatch(uint256 idA, uint256 idB); + +error InsufficientBalance(uint256 balance, uint256 amount); + +error PastDate(); + +error Expired(uint256 id); + +error NoExpiration(uint256 id); + +error NotRenewable(uint256 id); + +error AlreadyRegistered(address registry); + +error NotRegistered(address registry); + +error InvalidRegistry(address registry); + +error NotClaimable(); + +error AlreadyClaimed(); + +error RoleAlreadyGranted(address account, string role); + +error RoleNotGranted(address account, string role); + +error ExceedsMaxSupply(uint256 maxSupply); diff --git a/contracts-modularized/utils/Initializable.sol b/contracts-modularized/utils/Initializable.sol new file mode 100644 index 000000000..869059fc8 --- /dev/null +++ b/contracts-modularized/utils/Initializable.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) + +pragma solidity ^0.8.2; + +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; + +/** + * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed + * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an + * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer + * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. + * + * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be + * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in + * case an upgrade adds a module that needs to be initialized. + * + * For example: + * + * [.hljs-theme-light.nopadding] + * ``` + * contract MyToken is ERC20Upgradeable { + * function initialize() initializer public { + * __ERC20_init("MyToken", "MTK"); + * } + * } + * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { + * function initializeV2() reinitializer(2) public { + * __ERC20Permit_init("MyToken"); + * } + * } + * ``` + * + * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as + * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. + * + * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure + * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. + * + * [CAUTION] + * ==== + * Avoid leaving a contract uninitialized. + * + * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation + * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke + * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: + * + * [.hljs-theme-light.nopadding] + * ``` + * /// @custom:oz-upgrades-unsafe-allow constructor + * constructor() { + * _disableInitializers(); + * } + * ``` + * ==== + */ + +bytes32 constant INIT_POSITION = keccak256("diamond.initializable.storage"); + +struct InitStruct { + uint8 _initialized; + bool _initializing; +} + +function ds() pure returns (InitStruct storage initStruct) { + bytes32 position = INIT_POSITION; + assembly { + initStruct.slot := position + } +} + +abstract contract Initializable { + /** + * @dev Indicates that the contract has been initialized. + * @custom:oz-retyped-from bool + */ + /** + * @dev Indicates that the contract is in the process of being initialized. + */ + + /** + * @dev Triggered when the contract has been initialized or reinitialized. + */ + event Initialized(uint8 version); + + /** + * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, + * `onlyInitializing` functions can be used to initialize parent contracts. + * + * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a + * constructor. + * + * Emits an {Initialized} event. + */ + modifier initializer() { + bool isTopLevelCall = !ds()._initializing; + require( + (isTopLevelCall && ds()._initialized < 1) || + (!AddressUpgradeable.isContract(address(this)) && + ds()._initialized == 1), + "Initializable: contract is already initialized" + ); + ds()._initialized = 1; + if (isTopLevelCall) { + ds()._initializing = true; + } + _; + if (isTopLevelCall) { + ds()._initializing = false; + emit Initialized(1); + } + } + + /** + * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the + * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be + * used to initialize parent contracts. + * + * A reinitializer may be used after the original initialization step. This is essential to configure modules that + * are added through upgrades and that require initialization. + * + * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` + * cannot be nested. If one is invoked in the context of another, execution will revert. + * + * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in + * a contract, executing them in the right order is up to the developer or operator. + * + * WARNING: setting the version to 255 will prevent any future reinitialization. + * + * Emits an {Initialized} event. + */ + modifier reinitializer(uint8 version) { + require( + !ds()._initializing && ds()._initialized < version, + "Initializable: contract is already initialized" + ); + ds()._initialized = version; + ds()._initializing = true; + _; + ds()._initializing = false; + emit Initialized(version); + } + + /** + * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the + * {initializer} and {reinitializer} modifiers, directly or indirectly. + */ + modifier onlyInitializing() { + require( + ds()._initializing, + "Initializable: contract is not initializing" + ); + _; + } + + /** + * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. + * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized + * to any version. It is recommended to use this to lock implementation contracts that are designed to be called + * through proxies. + * + * Emits an {Initialized} event the first time it is successfully executed. + */ + function _disableInitializers() internal virtual { + require(!ds()._initializing, "Initializable: contract is initializing"); + if (ds()._initialized < type(uint8).max) { + ds()._initialized = type(uint8).max; + emit Initialized(type(uint8).max); + } + } + + /** + * @dev Returns the highest version that has been initialized. See {reinitializer}. + */ + function _getInitializedVersion() internal view returns (uint8) { + return ds()._initialized; + } + + /** + * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. + */ + function _isInitializing() internal view returns (bool) { + return ds()._initializing; + } +} diff --git a/contracts-upgradeable/ERC5727/ERC5727EnumerableUpgradeable.sol b/contracts-upgradeable/ERC5727/ERC5727EnumerableUpgradeable.sol index 7ced2fa78..84771fc8f 100644 --- a/contracts-upgradeable/ERC5727/ERC5727EnumerableUpgradeable.sol +++ b/contracts-upgradeable/ERC5727/ERC5727EnumerableUpgradeable.sol @@ -106,12 +106,6 @@ abstract contract ERC5727EnumerableUpgradeable is super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } - function _burn( - uint256 tokenId - ) internal virtual override(ERC3525Upgradeable, ERC5727Upgradeable) { - ERC5727Upgradeable._burn(tokenId); - } - function _beforeValueTransfer( address from, address to, diff --git a/contracts-upgradeable/ERC5727/ERC5727Upgradeable.sol b/contracts-upgradeable/ERC5727/ERC5727Upgradeable.sol index ac9227be7..b1b79ca38 100644 --- a/contracts-upgradeable/ERC5727/ERC5727Upgradeable.sol +++ b/contracts-upgradeable/ERC5727/ERC5727Upgradeable.sol @@ -30,6 +30,7 @@ contract ERC5727Upgradeable is mapping(uint256 => address) internal _verifiers; mapping(uint256 => BurnAuth) internal _burnAuths; mapping(uint256 => bool) internal _unlocked; + mapping(uint256 => bool) internal _revoked; mapping(uint256 => address) internal _slotVerifiers; mapping(uint256 => BurnAuth) internal _slotBurnAuths; @@ -195,6 +196,12 @@ contract ERC5727Upgradeable is data; } + function isRevoked(uint256 tokenId) public view virtual returns (bool) { + _requireMinted(tokenId); + + return _revoked[tokenId]; + } + function locked( uint256 tokenId ) public view virtual override returns (bool) { @@ -225,16 +232,8 @@ contract ERC5727Upgradeable is return (owner() == from) || _minterRole[slot][from]; } - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - - delete _issuers[tokenId]; - delete _verifiers[tokenId]; - delete _burnAuths[tokenId]; - } - function _revoke(address from, uint256 tokenId) internal virtual { - _burn(tokenId); + _revoked[tokenId] = true; emit Revoked(from, tokenId); } diff --git a/contracts-upgradeable/core/ERC5727SBTUpgradeable.sol b/contracts-upgradeable/core/ERC5727SBTUpgradeable.sol index dd05d78b7..f618b8905 100644 --- a/contracts-upgradeable/core/ERC5727SBTUpgradeable.sol +++ b/contracts-upgradeable/core/ERC5727SBTUpgradeable.sol @@ -48,16 +48,6 @@ contract ERC5727SBTUpgradeable is return _baseUri; } - function _burn( - uint256 tokenId - ) - internal - virtual - override(ERC5727Upgradeable, ERC5727EnumerableUpgradeable) - { - super._burn(tokenId); - } - function _beforeTokenTransfer( address from, address to, diff --git a/contracts-upgradeable/examples/ERC5727ExampleUpgradeable.sol b/contracts-upgradeable/examples/ERC5727ExampleUpgradeable.sol index 78bfce478..222a7fc4b 100644 --- a/contracts-upgradeable/examples/ERC5727ExampleUpgradeable.sol +++ b/contracts-upgradeable/examples/ERC5727ExampleUpgradeable.sol @@ -20,7 +20,7 @@ contract ERC5727ExampleUpgradeable is string memory name_, string memory symbol_, address admin_, - string memory baseURI_, + string memory baseUri_, string memory version_ ) public initializer { __EIP712_init_unchained(name_, version_); @@ -28,7 +28,7 @@ contract ERC5727ExampleUpgradeable is __ERC3525_init_unchained(18); __ERC5727_init_unchained(admin_); __ERC5727Governance_init_unchained(admin_); - __ERC5727Example_init_unchained(baseURI_); + __ERC5727Example_init_unchained(baseUri_); } function __ERC5727Example_init_unchained( @@ -41,16 +41,6 @@ contract ERC5727ExampleUpgradeable is return _baseUri; } - function _burn( - uint256 tokenId - ) - internal - virtual - override(ERC5727Upgradeable, ERC5727EnumerableUpgradeable) - { - super._burn(tokenId); - } - function _beforeTokenTransfer( address from, address to, diff --git a/contracts/ERC5727/ERC5727.sol b/contracts/ERC5727/ERC5727.sol index 7d075a04d..780c679ff 100644 --- a/contracts/ERC5727/ERC5727.sol +++ b/contracts/ERC5727/ERC5727.sol @@ -27,6 +27,7 @@ contract ERC5727 is EIP712, Ownable, ERC3525, IERC5727Metadata { mapping(uint256 => address) internal _verifiers; mapping(uint256 => BurnAuth) internal _burnAuths; mapping(uint256 => bool) internal _unlocked; + mapping(uint256 => bool) internal _revoked; mapping(uint256 => address) internal _slotVerifiers; mapping(uint256 => BurnAuth) internal _slotBurnAuths; @@ -182,6 +183,12 @@ contract ERC5727 is EIP712, Ownable, ERC3525, IERC5727Metadata { data; } + function isRevoked(uint256 tokenId) public view virtual returns (bool) { + _requireMinted(tokenId); + + return _revoked[tokenId]; + } + function locked( uint256 tokenId ) public view virtual override returns (bool) { @@ -226,16 +233,8 @@ contract ERC5727 is EIP712, Ownable, ERC3525, IERC5727Metadata { return _burnerRole[tokenId][from]; } - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - - delete _issuers[tokenId]; - delete _verifiers[tokenId]; - delete _burnAuths[tokenId]; - } - function _revoke(address from, uint256 tokenId) internal virtual { - _burn(tokenId); + _revoked[tokenId] = true; emit Revoked(from, tokenId); } diff --git a/contracts/ERC5727/ERC5727Enumerable.sol b/contracts/ERC5727/ERC5727Enumerable.sol index 218b3e15c..b6fd8dbc2 100644 --- a/contracts/ERC5727/ERC5727Enumerable.sol +++ b/contracts/ERC5727/ERC5727Enumerable.sol @@ -90,12 +90,6 @@ abstract contract ERC5727Enumerable is super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } - function _burn( - uint256 tokenId - ) internal virtual override(ERC3525, ERC5727) { - ERC5727._burn(tokenId); - } - function _beforeValueTransfer( address from, address to, diff --git a/contracts/examples/ERC5727Example.sol b/contracts/examples/ERC5727Example.sol index 4db9c05df..015319f37 100644 --- a/contracts/examples/ERC5727Example.sol +++ b/contracts/examples/ERC5727Example.sol @@ -30,12 +30,6 @@ contract ERC5727Example is return _baseTokenURI; } - function _burn( - uint256 tokenId - ) internal virtual override(ERC5727, ERC5727Enumerable) { - super._burn(tokenId); - } - function _beforeTokenTransfer( address from, address to, diff --git a/hardhat.config.ts b/hardhat.config.ts index 2f9a22315..0028e6ee6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -20,7 +20,12 @@ const config: HardhatUserConfig = { }, }, paths: { - sources: process.env.UPGRADEABLE === '1' ? './contracts-upgradeable' : './contracts', + sources: + process.env.MODULARIZED === '1' + ? './contracts-modularized' + : process.env.UPGRADEABLE === '1' + ? './contracts-upgradeable' + : './contracts', }, ...(process.env.PRIVATE_KEY ? { networks } : { defaultNetwork: 'hardhat' }), typechain: { diff --git a/package.json b/package.json index 99349916b..8e8114634 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "scripts": { "compile": "NODE_ENV=development hardhat compile", "compile:upgradeable": "NODE_ENV=development UPGRADEABLE=1 hardhat compile", + "compile:modularized": "NODE_ENV=development MODULARIZED=1 hardhat compile", "deploy:chapel": "hardhat run scripts/deploy.ts --network chapel", "deploy:goerli": "hardhat run scripts/deploy.ts --network goerli", "deploy:hardhat": "hardhat run scripts/deploy.ts --network hardhat", @@ -30,7 +31,8 @@ "prepare": "husky install", "release": "standard-version", "test": "NODE_ENV=development hardhat test", - "test:coverage": "NODE_ENV=development hardhat coverage --testfiles 'test/*.ts'", + "test:modularized": "NODE_ENV=development hardhat test test/modularContract.test.ts", + "test:coverage": "pnpm run compile && pnpm run compile:modularized && NODE_ENV=development hardhat coverage --testfiles 'test/*.ts'", "typechain": "NODE_ENV=development hardhat typechain" }, "lint-staged": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26aca287e..20dc802e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,6 @@ lockfileVersion: '6.0' importers: - .: dependencies: '@openzeppelin/contracts': @@ -125,25 +124,35 @@ importers: contracts: {} + contracts-modularized: {} + contracts-upgradeable: {} packages: - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==, + } + engines: { node: '>=6.9.0' } dependencies: '@babel/highlight': 7.18.6 dev: true /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, + } + engines: { node: '>=6.9.0' } dev: true /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, + } + engines: { node: '>=6.9.0' } dependencies: '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 @@ -151,15 +160,21 @@ packages: dev: true /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: '>=0.1.90' } requiresBuild: true dev: true optional: true /@commitlint/cli@17.5.0: - resolution: {integrity: sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==, + } + engines: { node: '>=v14' } hasBin: true dependencies: '@commitlint/format': 17.4.4 @@ -178,23 +193,32 @@ packages: dev: true /@commitlint/config-conventional@17.4.4: - resolution: {integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==, + } + engines: { node: '>=v14' } dependencies: conventional-changelog-conventionalcommits: 5.0.0 dev: true /@commitlint/config-validator@17.4.4: - resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/types': 17.4.4 ajv: 8.12.0 dev: true /@commitlint/ensure@17.4.4: - resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/types': 17.4.4 lodash.camelcase: 4.3.0 @@ -205,29 +229,41 @@ packages: dev: true /@commitlint/execute-rule@17.4.0: - resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==, + } + engines: { node: '>=v14' } dev: true /@commitlint/format@17.4.4: - resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/types': 17.4.4 chalk: 4.1.2 dev: true /@commitlint/is-ignored@17.4.4: - resolution: {integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/types': 17.4.4 semver: 7.3.8 dev: true /@commitlint/lint@17.4.4: - resolution: {integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/is-ignored': 17.4.4 '@commitlint/parse': 17.4.4 @@ -236,8 +272,11 @@ packages: dev: true /@commitlint/load@17.5.0: - resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/config-validator': 17.4.4 '@commitlint/execute-rule': 17.4.0 @@ -259,13 +298,19 @@ packages: dev: true /@commitlint/message@17.4.2: - resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==, + } + engines: { node: '>=v14' } dev: true /@commitlint/parse@17.4.4: - resolution: {integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/types': 17.4.4 conventional-changelog-angular: 5.0.13 @@ -273,8 +318,11 @@ packages: dev: true /@commitlint/read@17.5.1: - resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/top-level': 17.4.0 '@commitlint/types': 17.4.4 @@ -284,8 +332,11 @@ packages: dev: true /@commitlint/resolve-extends@17.4.4: - resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/config-validator': 17.4.4 '@commitlint/types': 17.4.4 @@ -296,8 +347,11 @@ packages: dev: true /@commitlint/rules@17.4.4: - resolution: {integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==, + } + engines: { node: '>=v14' } dependencies: '@commitlint/ensure': 17.4.4 '@commitlint/message': 17.4.2 @@ -307,34 +361,49 @@ packages: dev: true /@commitlint/to-lines@17.4.0: - resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==, + } + engines: { node: '>=v14' } dev: true /@commitlint/top-level@17.4.0: - resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==, + } + engines: { node: '>=v14' } dependencies: find-up: 5.0.0 dev: true /@commitlint/types@17.4.4: - resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} - engines: {node: '>=v14'} + resolution: + { + integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==, + } + engines: { node: '>=v14' } dependencies: chalk: 4.1.2 dev: true /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true /@eslint-community/eslint-utils@4.4.0(eslint@8.36.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: @@ -343,13 +412,19 @@ packages: dev: true /@eslint-community/regexpp@4.5.0: - resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } dev: true /@eslint/eslintrc@2.0.2: - resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) @@ -365,12 +440,18 @@ packages: dev: true /@eslint/js@8.36.0: - resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + resolution: + { + integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==, + } dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -384,7 +465,10 @@ packages: dev: true /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + resolution: + { + integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==, + } dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -396,7 +480,10 @@ packages: dev: true /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + resolution: + { + integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==, + } dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -406,7 +493,10 @@ packages: dev: true /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + resolution: + { + integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==, + } dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -416,20 +506,29 @@ packages: dev: true /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + resolution: + { + integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==, + } dependencies: '@ethersproject/bytes': 5.7.0 dev: true /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + resolution: + { + integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 dev: true /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + resolution: + { + integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -437,19 +536,28 @@ packages: dev: true /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + resolution: + { + integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==, + } dependencies: '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + resolution: + { + integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==, + } dependencies: '@ethersproject/bignumber': 5.7.0 dev: true /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + resolution: + { + integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==, + } dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -464,7 +572,10 @@ packages: dev: true /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + resolution: + { + integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==, + } dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -478,7 +589,10 @@ packages: dev: true /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + resolution: + { + integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==, + } dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -495,7 +609,10 @@ packages: dev: true /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + resolution: + { + integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==, + } dependencies: '@ethersproject/abstract-signer': 5.7.0 '@ethersproject/address': 5.7.0 @@ -513,37 +630,55 @@ packages: dev: true /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + resolution: + { + integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==, + } dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 dev: true /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + resolution: + { + integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==, + } dev: true /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + resolution: + { + integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==, + } dependencies: '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + resolution: + { + integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 dev: true /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + resolution: + { + integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==, + } dependencies: '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + resolution: + { + integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==, + } dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -571,21 +706,30 @@ packages: dev: true /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + resolution: + { + integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + resolution: + { + integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + resolution: + { + integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -593,7 +737,10 @@ packages: dev: true /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + resolution: + { + integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 @@ -604,7 +751,10 @@ packages: dev: true /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + resolution: + { + integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==, + } dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -615,7 +765,10 @@ packages: dev: true /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + resolution: + { + integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 @@ -623,7 +776,10 @@ packages: dev: true /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + resolution: + { + integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==, + } dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -637,7 +793,10 @@ packages: dev: true /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + resolution: + { + integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==, + } dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 @@ -645,7 +804,10 @@ packages: dev: true /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + resolution: + { + integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==, + } dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -665,7 +827,10 @@ packages: dev: true /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + resolution: + { + integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==, + } dependencies: '@ethersproject/base64': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -675,7 +840,10 @@ packages: dev: true /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + resolution: + { + integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==, + } dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/hash': 5.7.0 @@ -685,8 +853,11 @@ packages: dev: true /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} + resolution: + { + integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==, + } + engines: { node: '>=10.10.0' } dependencies: '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4(supports-color@8.1.1) @@ -696,38 +867,59 @@ packages: dev: true /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } dev: true /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } dev: true /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, + } + engines: { node: '>=6.9.0' } dev: true /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: '>=6.0.0' } dev: true /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } dev: true /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@metamask/eth-sig-util@4.0.1: - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==, + } + engines: { node: '>=12.0.0' } dependencies: ethereumjs-abi: 0.6.8 ethereumjs-util: 6.2.1 @@ -737,7 +929,10 @@ packages: dev: true /@morgan-stanley/ts-mocking-bird@0.6.4(typescript@5.0.2): - resolution: {integrity: sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==} + resolution: + { + integrity: sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==, + } peerDependencies: jasmine: 2.x || 3.x || 4.x jest: 26.x || 27.x || 28.x @@ -754,37 +949,55 @@ packages: dev: true /@noble/hashes@1.2.0: - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + resolution: + { + integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==, + } dev: true /@noble/secp256k1@1.7.1: - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + resolution: + { + integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==, + } dev: true /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 dev: true /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } dev: true /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 dev: true /@nomicfoundation/ethereumjs-block@4.2.2: - resolution: {integrity: sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-common': 3.1.2 '@nomicfoundation/ethereumjs-rlp': 4.0.3 @@ -795,8 +1008,11 @@ packages: dev: true /@nomicfoundation/ethereumjs-blockchain@6.2.2: - resolution: {integrity: sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-block': 4.2.2 '@nomicfoundation/ethereumjs-common': 3.1.2 @@ -815,15 +1031,21 @@ packages: dev: true /@nomicfoundation/ethereumjs-common@3.1.2: - resolution: {integrity: sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==} + resolution: + { + integrity: sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==, + } dependencies: '@nomicfoundation/ethereumjs-util': 8.0.6 crc-32: 1.2.2 dev: true /@nomicfoundation/ethereumjs-ethash@2.0.5: - resolution: {integrity: sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-block': 4.2.2 '@nomicfoundation/ethereumjs-rlp': 4.0.3 @@ -834,8 +1056,11 @@ packages: dev: true /@nomicfoundation/ethereumjs-evm@1.3.2: - resolution: {integrity: sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-common': 3.1.2 '@nomicfoundation/ethereumjs-util': 8.0.6 @@ -850,13 +1075,19 @@ packages: dev: true /@nomicfoundation/ethereumjs-rlp@4.0.3: - resolution: {integrity: sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==, + } + engines: { node: '>=14' } hasBin: true dev: true /@nomicfoundation/ethereumjs-statemanager@1.0.5: - resolution: {integrity: sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==} + resolution: + { + integrity: sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==, + } dependencies: '@nomicfoundation/ethereumjs-common': 3.1.2 '@nomicfoundation/ethereumjs-rlp': 4.0.3 @@ -870,8 +1101,11 @@ packages: dev: true /@nomicfoundation/ethereumjs-trie@5.0.5: - resolution: {integrity: sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-rlp': 4.0.3 '@nomicfoundation/ethereumjs-util': 8.0.6 @@ -880,8 +1114,11 @@ packages: dev: true /@nomicfoundation/ethereumjs-tx@4.1.2: - resolution: {integrity: sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-common': 3.1.2 '@nomicfoundation/ethereumjs-rlp': 4.0.3 @@ -890,16 +1127,22 @@ packages: dev: true /@nomicfoundation/ethereumjs-util@8.0.6: - resolution: {integrity: sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-rlp': 4.0.3 ethereum-cryptography: 0.1.3 dev: true /@nomicfoundation/ethereumjs-vm@6.4.2: - resolution: {integrity: sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==, + } + engines: { node: '>=14' } dependencies: '@nomicfoundation/ethereumjs-block': 4.2.2 '@nomicfoundation/ethereumjs-blockchain': 6.2.2 @@ -922,7 +1165,10 @@ packages: dev: true /@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.2)(chai@4.3.7)(ethers@5.7.2)(hardhat@2.13.0): - resolution: {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} + resolution: + { + integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==, + } peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 chai: ^4.2.0 @@ -941,7 +1187,10 @@ packages: dev: true /@nomicfoundation/hardhat-network-helpers@1.0.8(hardhat@2.13.0): - resolution: {integrity: sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==} + resolution: + { + integrity: sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==, + } peerDependencies: hardhat: ^2.9.5 dependencies: @@ -950,7 +1199,10 @@ packages: dev: true /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.8)(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@10.2.0)(@typechain/hardhat@6.1.5)(@types/chai@4.3.4)(@types/mocha@10.0.1)(@types/node@18.15.10)(chai@4.3.7)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.13.0)(solidity-coverage@0.8.2)(ts-node@10.9.1)(typechain@8.1.1)(typescript@5.0.2): - resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} + resolution: + { + integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==, + } peerDependencies: '@ethersproject/abi': ^5.4.7 '@ethersproject/providers': ^5.4.7 @@ -994,8 +1246,11 @@ packages: dev: true /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [darwin] requiresBuild: true @@ -1003,8 +1258,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==, + } + engines: { node: '>= 10' } cpu: [x64] os: [darwin] requiresBuild: true @@ -1012,8 +1270,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==, + } + engines: { node: '>= 10' } cpu: [x64] os: [freebsd] requiresBuild: true @@ -1021,8 +1282,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] requiresBuild: true @@ -1030,8 +1294,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] requiresBuild: true @@ -1039,8 +1306,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] requiresBuild: true @@ -1048,8 +1318,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] requiresBuild: true @@ -1057,8 +1330,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [win32] requiresBuild: true @@ -1066,8 +1342,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==, + } + engines: { node: '>= 10' } cpu: [ia32] os: [win32] requiresBuild: true @@ -1075,8 +1354,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==, + } + engines: { node: '>= 10' } cpu: [x64] os: [win32] requiresBuild: true @@ -1084,8 +1366,11 @@ packages: optional: true /@nomicfoundation/solidity-analyzer@0.1.1: - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==, + } + engines: { node: '>= 12' } optionalDependencies: '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 @@ -1100,7 +1385,10 @@ packages: dev: true /@nomiclabs/hardhat-ethers@2.2.2(ethers@5.7.2)(hardhat@2.13.0): - resolution: {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} + resolution: + { + integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==, + } peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 @@ -1110,7 +1398,10 @@ packages: dev: true /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.0): - resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} + resolution: + { + integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==, + } peerDependencies: hardhat: ^2.0.4 dependencies: @@ -1130,7 +1421,10 @@ packages: dev: true /@nomiclabs/hardhat-solhint@3.0.0(hardhat@2.13.0): - resolution: {integrity: sha512-uouERJ2UVsN5ek2veA8nq/Pwq06INRcWdZxjE1vcEZ4i+Et8Qiy0SrPO7KRU0rh3rssBgfOtCbbAEOfh7YBAvA==} + resolution: + { + integrity: sha512-uouERJ2UVsN5ek2veA8nq/Pwq06INRcWdZxjE1vcEZ4i+Et8Qiy0SrPO7KRU0rh3rssBgfOtCbbAEOfh7YBAvA==, + } peerDependencies: hardhat: ^2.0.0 dependencies: @@ -1139,15 +1433,24 @@ packages: dev: true /@openzeppelin/contracts-upgradeable@4.8.2: - resolution: {integrity: sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==} + resolution: + { + integrity: sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==, + } dev: false /@openzeppelin/contracts@4.8.2: - resolution: {integrity: sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==} + resolution: + { + integrity: sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==, + } dev: false /@openzeppelin/hardhat-upgrades@1.22.1(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.0): - resolution: {integrity: sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==} + resolution: + { + integrity: sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==, + } hasBin: true peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -1172,7 +1475,10 @@ packages: dev: true /@openzeppelin/upgrades-core@1.24.1: - resolution: {integrity: sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==} + resolution: + { + integrity: sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==, + } dependencies: cbor: 8.1.0 chalk: 4.1.2 @@ -1186,7 +1492,10 @@ packages: dev: true /@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.13.0)(squirrelly@8.0.8): - resolution: {integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==} + resolution: + { + integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==, + } peerDependencies: hardhat: ^2.6.4 squirrelly: ^8.0.8 @@ -1196,11 +1505,17 @@ packages: dev: true /@scure/base@1.1.1: - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + resolution: + { + integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==, + } dev: true /@scure/bip32@1.1.5: - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + resolution: + { + integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==, + } dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 @@ -1208,15 +1523,21 @@ packages: dev: true /@scure/bip39@1.1.1: - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + resolution: + { + integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==, + } dependencies: '@noble/hashes': 1.2.0 '@scure/base': 1.1.1 dev: true /@sentry/core@5.30.0: - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==, + } + engines: { node: '>=6' } dependencies: '@sentry/hub': 5.30.0 '@sentry/minimal': 5.30.0 @@ -1226,8 +1547,11 @@ packages: dev: true /@sentry/hub@5.30.0: - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==, + } + engines: { node: '>=6' } dependencies: '@sentry/types': 5.30.0 '@sentry/utils': 5.30.0 @@ -1235,8 +1559,11 @@ packages: dev: true /@sentry/minimal@5.30.0: - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==, + } + engines: { node: '>=6' } dependencies: '@sentry/hub': 5.30.0 '@sentry/types': 5.30.0 @@ -1244,8 +1571,11 @@ packages: dev: true /@sentry/node@5.30.0: - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==, + } + engines: { node: '>=6' } dependencies: '@sentry/core': 5.30.0 '@sentry/hub': 5.30.0 @@ -1261,8 +1591,11 @@ packages: dev: true /@sentry/tracing@5.30.0: - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==, + } + engines: { node: '>=6' } dependencies: '@sentry/hub': 5.30.0 '@sentry/minimal': 5.30.0 @@ -1272,32 +1605,47 @@ packages: dev: true /@sentry/types@5.30.0: - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==, + } + engines: { node: '>=6' } dev: true /@sentry/utils@5.30.0: - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==, + } + engines: { node: '>=6' } dependencies: '@sentry/types': 5.30.0 tslib: 1.14.1 dev: true /@solidity-parser/parser@0.14.5: - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + resolution: + { + integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==, + } dependencies: antlr4ts: 0.5.0-alpha.4 dev: true /@solidity-parser/parser@0.16.0: - resolution: {integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==} + resolution: + { + integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==, + } dependencies: antlr4ts: 0.5.0-alpha.4 dev: true /@tenderly/hardhat-tenderly@1.6.1(hardhat@2.13.0)(tenderly@0.4.0): - resolution: {integrity: sha512-VhnOcRVB8J1mZk5QUifthsidyEb4p6Qj0nyy07qdnF8GL/kcVDBgqluyapGS1hUhp/SVQqpKHcFTWbVJ/B0l4w==} + resolution: + { + integrity: sha512-VhnOcRVB8J1mZk5QUifthsidyEb4p6Qj0nyy07qdnF8GL/kcVDBgqluyapGS1hUhp/SVQqpKHcFTWbVJ/B0l4w==, + } peerDependencies: hardhat: ^2.10.2 tenderly: ^0.4.0 @@ -1320,23 +1668,38 @@ packages: dev: true /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + resolution: + { + integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, + } dev: true /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } dev: true /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } dev: true /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + resolution: + { + integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==, + } dev: true /@typechain/ethers-v5@10.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.1.1)(typescript@5.0.2): - resolution: {integrity: sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==} + resolution: + { + integrity: sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==, + } peerDependencies: '@ethersproject/abi': ^5.0.0 '@ethersproject/bytes': ^5.0.0 @@ -1356,7 +1719,10 @@ packages: dev: true /@typechain/hardhat@6.1.5(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.0)(ethers@5.7.2)(hardhat@2.13.0)(typechain@8.1.1): - resolution: {integrity: sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==} + resolution: + { + integrity: sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==, + } peerDependencies: '@ethersproject/abi': ^5.4.7 '@ethersproject/providers': ^5.4.7 @@ -1375,117 +1741,189 @@ packages: dev: true /@types/async-eventemitter@0.2.1: - resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==} + resolution: + { + integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==, + } dev: true /@types/bn.js@4.11.6: - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + resolution: + { + integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/bn.js@5.1.1: - resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} + resolution: + { + integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/chai-as-promised@7.1.5: - resolution: {integrity: sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==} + resolution: + { + integrity: sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==, + } dependencies: '@types/chai': 4.3.4 dev: true /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + resolution: + { + integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==, + } dev: true /@types/concat-stream@1.6.1: - resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + resolution: + { + integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/form-data@0.0.33: - resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + resolution: + { + integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + resolution: + { + integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==, + } dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.10 dev: true /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + resolution: + { + integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, + } dev: true /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } dev: true /@types/lru-cache@5.1.1: - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + resolution: + { + integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==, + } dev: true /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + resolution: + { + integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, + } dev: true /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + resolution: + { + integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, + } dev: true /@types/mocha@10.0.1: - resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} + resolution: + { + integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==, + } dev: true /@types/node@10.17.60: - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + resolution: + { + integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==, + } dev: true /@types/node@18.15.10: - resolution: {integrity: sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==} + resolution: + { + integrity: sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==, + } dev: true /@types/node@8.10.66: - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + resolution: + { + integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==, + } dev: true /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + resolution: + { + integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, + } dev: true /@types/pbkdf2@3.1.0: - resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + resolution: + { + integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/prettier@2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + resolution: + { + integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==, + } dev: true /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + resolution: + { + integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==, + } dev: true /@types/secp256k1@4.0.3: - resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} + resolution: + { + integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==, + } dependencies: '@types/node': 18.15.10 dev: true /@types/semver@7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + resolution: + { + integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==, + } dev: true /@typescript-eslint/eslint-plugin@5.56.0(@typescript-eslint/parser@5.58.0)(eslint@8.36.0)(typescript@5.0.2): - resolution: {integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: '@typescript-eslint/parser': ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1512,8 +1950,11 @@ packages: dev: true /@typescript-eslint/parser@5.58.0(eslint@8.36.0)(typescript@5.0.2): - resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' @@ -1532,24 +1973,33 @@ packages: dev: true /@typescript-eslint/scope-manager@5.56.0: - resolution: {integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: '@typescript-eslint/types': 5.56.0 '@typescript-eslint/visitor-keys': 5.56.0 dev: true /@typescript-eslint/scope-manager@5.58.0: - resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: '@typescript-eslint/types': 5.58.0 '@typescript-eslint/visitor-keys': 5.58.0 dev: true /@typescript-eslint/type-utils@5.56.0(eslint@8.36.0)(typescript@5.0.2): - resolution: {integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: '*' typescript: '*' @@ -1568,18 +2018,27 @@ packages: dev: true /@typescript-eslint/types@5.56.0: - resolution: {integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true /@typescript-eslint/types@5.58.0: - resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true /@typescript-eslint/typescript-estree@5.56.0(typescript@5.0.2): - resolution: {integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1599,8 +2058,11 @@ packages: dev: true /@typescript-eslint/typescript-estree@5.58.0(typescript@5.0.2): - resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1620,8 +2082,11 @@ packages: dev: true /@typescript-eslint/utils@5.56.0(eslint@8.36.0)(typescript@5.0.2): - resolution: {integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -1640,23 +2105,32 @@ packages: dev: true /@typescript-eslint/visitor-keys@5.56.0: - resolution: {integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: '@typescript-eslint/types': 5.56.0 eslint-visitor-keys: 3.4.0 dev: true /@typescript-eslint/visitor-keys@5.58.0: - resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: '@typescript-eslint/types': 5.58.0 eslint-visitor-keys: 3.4.0 dev: true /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } hasBin: true dependencies: jsonparse: 1.3.1 @@ -1664,19 +2138,28 @@ packages: dev: true /abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + resolution: + { + integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==, + } dev: true /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: '>=6.5' } dependencies: event-target-shim: 5.0.1 dev: true /abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==, + } + engines: { node: '>=12' } dependencies: buffer: 6.0.3 catering: 2.1.1 @@ -1688,15 +2171,21 @@ packages: dev: true /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: '>= 0.6' } dependencies: mime-types: 2.1.35 negotiator: 0.6.3 dev: true /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -1704,37 +2193,58 @@ packages: dev: true /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: '>=0.4.0' } dev: true /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, + } + engines: { node: '>=0.4.0' } hasBin: true dev: true /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + resolution: + { + integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, + } dev: true /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==, + } + engines: { node: '>= 10.0.0' } dev: true /adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} + resolution: + { + integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==, + } + engines: { node: '>=0.3.0' } dev: true /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + resolution: + { + integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==, + } dev: true /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: '>= 6.0.0' } dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: @@ -1742,15 +2252,21 @@ packages: dev: true /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: '>=8' } dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 dev: true /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -1759,7 +2275,10 @@ packages: dev: true /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -1768,131 +2287,203 @@ packages: dev: true /amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} + resolution: + { + integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, + } + engines: { node: '>=0.4.2' } dev: true optional: true /ansi-colors@3.2.3: - resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==, + } + engines: { node: '>=6' } dev: true /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, + } + engines: { node: '>=6' } dev: true /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } dev: true /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } dependencies: type-fest: 0.21.3 dev: true /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, + } + engines: { node: '>=4' } dev: true /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, + } + engines: { node: '>=6' } dev: true /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } dev: true /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: '>=12' } dev: true /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } dependencies: color-convert: 1.9.3 dev: true /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } dependencies: color-convert: 2.0.1 dev: true /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } dev: true /antlr4@4.12.0: - resolution: {integrity: sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==, + } + engines: { node: '>=16' } dev: true /antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + resolution: + { + integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==, + } dev: true /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 dev: true /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } dev: true /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } dependencies: sprintf-js: 1.0.3 dev: true /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } dev: true /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==, + } + engines: { node: '>=6' } dev: true /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==, + } + engines: { node: '>=8' } dev: true /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + resolution: + { + integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, + } dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: true /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } dev: true /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } dev: true /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1902,18 +2493,27 @@ packages: dev: true /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: '>=8' } dev: true /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==, + } + engines: { node: '>=0.10.0' } dev: true /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1922,8 +2522,11 @@ packages: dev: true /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1932,8 +2535,11 @@ packages: dev: true /array.prototype.reduce@1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1943,78 +2549,126 @@ packages: dev: true /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: '>=0.10.0' } dev: true /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + resolution: + { + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, + } dev: true /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + resolution: + { + integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==, + } dependencies: safer-buffer: 2.1.2 dev: true /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==, + } + engines: { node: '>=0.8' } dev: true /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } dev: true /ast-parents@0.0.1: - resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} + resolution: + { + integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==, + } dev: true /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: '>=8' } dev: true /async-eventemitter@0.2.4: - resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + resolution: + { + integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==, + } dependencies: async: 2.6.4 dev: true /async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + resolution: + { + integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==, + } dev: true /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + resolution: + { + integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==, + } dependencies: lodash: 4.17.21 dev: true /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } dev: true /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: '>= 4.0.0' } dev: true /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + } + engines: { node: '>= 0.4' } dev: true /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + resolution: + { + integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==, + } dev: true /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + resolution: + { + integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==, + } dev: true /axios@0.21.4(debug@4.3.4): - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + resolution: + { + integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==, + } dependencies: follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: @@ -2022,7 +2676,10 @@ packages: dev: true /axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + resolution: + { + integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==, + } dependencies: follow-redirects: 1.15.2(debug@4.3.4) form-data: 4.0.0 @@ -2031,69 +2688,111 @@ packages: dev: true /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } dev: true /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + resolution: + { + integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==, + } dependencies: safe-buffer: 5.2.1 dev: true /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } dev: true /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + resolution: + { + integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, + } dependencies: tweetnacl: 0.14.5 dev: true /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + resolution: + { + integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, + } dev: true /bigint-crypto-utils@3.1.8: - resolution: {integrity: sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==} - engines: {node: '>=10.4.0'} + resolution: + { + integrity: sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==, + } + engines: { node: '>=10.4.0' } dependencies: bigint-mod-arith: 3.2.0 dev: true /bigint-mod-arith@3.2.0: - resolution: {integrity: sha512-Khb+sLGLqbe/2NOLVMOpCSgsC3lz8r3VIRZGc41hccudLPnvks7RYZNOnGukQZV8scn5+bA6MABga3Ueq6z3+w==} - engines: {node: '>=10.4.0'} + resolution: + { + integrity: sha512-Khb+sLGLqbe/2NOLVMOpCSgsC3lz8r3VIRZGc41hccudLPnvks7RYZNOnGukQZV8scn5+bA6MABga3Ueq6z3+w==, + } + engines: { node: '>=10.4.0' } dev: true /bignumber.js@9.1.1: - resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + resolution: + { + integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==, + } dev: true /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: '>=8' } dev: true /blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + resolution: + { + integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==, + } dev: true /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + resolution: + { + integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==, + } dev: true /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + resolution: + { + integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, + } dev: true /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + resolution: + { + integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, + } dev: true /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -2112,31 +2811,46 @@ packages: dev: true /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } dependencies: balanced-match: 1.0.2 dev: true /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: '>=8' } dependencies: fill-range: 7.0.1 dev: true /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } dev: true /browser-level@1.0.1: - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + resolution: + { + integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==, + } dependencies: abstract-level: 1.0.3 catering: 2.1.1 @@ -2145,11 +2859,17 @@ packages: dev: true /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + resolution: + { + integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, + } dev: true /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } dependencies: buffer-xor: 1.0.3 cipher-base: 1.0.4 @@ -2160,13 +2880,19 @@ packages: dev: true /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + resolution: + { + integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, + } dependencies: base-x: 3.0.9 dev: true /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + resolution: + { + integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==, + } dependencies: bs58: 4.0.1 create-hash: 1.2.0 @@ -2174,57 +2900,87 @@ packages: dev: true /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } dev: true /buffer-reverse@1.0.1: - resolution: {integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==} + resolution: + { + integrity: sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==, + } dev: true /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } dev: true /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: true /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + resolution: + { + integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, + } dependencies: semver: 7.4.0 dev: true /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: '>=10.16.0' } dependencies: streamsearch: 1.1.0 dev: true /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: '>= 0.8' } dev: true /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + } dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } dev: true /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: '>=8' } dependencies: camelcase: 5.3.1 map-obj: 4.3.0 @@ -2232,33 +2988,51 @@ packages: dev: true /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } dev: true /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } dev: true /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + resolution: + { + integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==, + } dev: true /catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==, + } + engines: { node: '>=6' } dev: true /cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} + resolution: + { + integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==, + } + engines: { node: '>=12.19' } dependencies: nofilter: 3.1.0 dev: true /chai-as-promised@7.1.1(chai@4.3.7): - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + resolution: + { + integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==, + } peerDependencies: chai: '>= 2.1.2 < 5' dependencies: @@ -2267,8 +3041,11 @@ packages: dev: true /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==, + } + engines: { node: '>=4' } dependencies: assertion-error: 1.1.0 check-error: 1.0.2 @@ -2280,8 +3057,11 @@ packages: dev: true /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 @@ -2289,29 +3069,44 @@ packages: dev: true /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 dev: true /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } dev: true /charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + resolution: + { + integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, + } dev: true /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + resolution: + { + integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==, + } dev: true /chokidar@3.3.0: - resolution: {integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==, + } + engines: { node: '>= 8.10.0' } dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -2325,8 +3120,11 @@ packages: dev: true /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: '>= 8.10.0' } dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -2340,19 +3138,28 @@ packages: dev: true /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + resolution: + { + integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, + } dev: true /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + resolution: + { + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, + } dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 dev: true /classic-level@1.3.0: - resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==, + } + engines: { node: '>=12' } requiresBuild: true dependencies: abstract-level: 1.0.3 @@ -2363,20 +3170,29 @@ packages: dev: true /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: '>=6' } dev: true /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: '>=8' } dependencies: restore-cursor: 3.1.0 dev: true /cli-table3@0.5.1: - resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==, + } + engines: { node: '>=6' } dependencies: object-assign: 4.1.1 string-width: 2.1.1 @@ -2385,8 +3201,11 @@ packages: dev: true /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} + resolution: + { + integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, + } + engines: { node: 10.* || >= 12.* } dependencies: string-width: 4.2.3 optionalDependencies: @@ -2394,23 +3213,32 @@ packages: dev: true /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==, + } + engines: { node: '>=8' } dependencies: slice-ansi: 3.0.0 string-width: 4.2.3 dev: true /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 dev: true /cliui@5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + resolution: + { + integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==, + } dependencies: string-width: 3.1.0 strip-ansi: 5.2.0 @@ -2418,7 +3246,10 @@ packages: dev: true /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -2426,8 +3257,11 @@ packages: dev: true /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -2435,49 +3269,76 @@ packages: dev: true /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } dependencies: color-name: 1.1.3 dev: true /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } dependencies: color-name: 1.1.4 dev: true /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } dev: true /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } dev: true /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + resolution: + { + integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==, + } dev: true /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} + resolution: + { + integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==, + } + engines: { node: '>=0.1.90' } dev: true /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } dependencies: delayed-stream: 1.0.0 dev: true /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + resolution: + { + integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, + } dev: true /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==, + } + engines: { node: '>=4.0.0' } dependencies: array-back: 3.1.0 find-replace: 3.0.0 @@ -2486,8 +3347,11 @@ packages: dev: true /command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==, + } + engines: { node: '>=8.0.0' } dependencies: array-back: 4.0.2 chalk: 2.4.2 @@ -2496,37 +3360,58 @@ packages: dev: true /commander@10.0.0: - resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==, + } + engines: { node: '>=14' } dev: true /commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + resolution: + { + integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==, + } dev: true /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } dev: true /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true /compare-versions@5.0.3: - resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} + resolution: + { + integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==, + } dev: true /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } dev: true /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + resolution: + { + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, + } + engines: { '0': node >= 0.8 } dependencies: buffer-from: 1.1.2 inherits: 2.0.4 @@ -2535,8 +3420,11 @@ packages: dev: true /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + resolution: + { + integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, + } + engines: { '0': node >= 6.0 } dependencies: buffer-from: 1.1.2 inherits: 2.0.4 @@ -2545,46 +3433,67 @@ packages: dev: true /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: '>= 0.6' } dependencies: safe-buffer: 5.2.1 dev: true /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } dev: true /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, + } + engines: { node: '>=10' } dependencies: compare-func: 2.0.0 q: 1.5.1 dev: true /conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + resolution: + { + integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==, + } dev: true /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, + } + engines: { node: '>=10' } dependencies: compare-func: 2.0.0 lodash: 4.17.21 @@ -2592,8 +3501,11 @@ packages: dev: true /conventional-changelog-conventionalcommits@5.0.0: - resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==, + } + engines: { node: '>=10' } dependencies: compare-func: 2.0.0 lodash: 4.17.21 @@ -2601,8 +3513,11 @@ packages: dev: true /conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==, + } + engines: { node: '>=10' } dependencies: add-stream: 1.0.0 conventional-changelog-writer: 5.0.1 @@ -2621,49 +3536,70 @@ packages: dev: true /conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==, + } + engines: { node: '>=10' } dependencies: q: 1.5.1 dev: true /conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==, + } + engines: { node: '>=10' } dependencies: compare-func: 2.0.0 q: 1.5.1 dev: true /conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==, + } + engines: { node: '>=10' } dev: true /conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, + } + engines: { node: '>=10' } hasBin: true dependencies: conventional-commits-filter: 2.0.7 @@ -2678,8 +3614,11 @@ packages: dev: true /conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==, + } + engines: { node: '>=10' } dependencies: conventional-changelog-angular: 5.0.13 conventional-changelog-atom: 2.0.8 @@ -2695,16 +3634,22 @@ packages: dev: true /conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, + } + engines: { node: '>=10' } dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 dev: true /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, + } + engines: { node: '>=10' } hasBin: true dependencies: JSONStream: 1.3.5 @@ -2716,8 +3661,11 @@ packages: dev: true /conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==, + } + engines: { node: '>=10' } hasBin: true dependencies: concat-stream: 2.0.0 @@ -2731,30 +3679,48 @@ packages: dev: true /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } dev: true /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==, + } + engines: { node: '>= 0.6' } dev: true /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: '>= 0.6' } dev: true /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + resolution: + { + integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, + } dev: true /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } dev: true /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.10)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.2): - resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} - engines: {node: '>=12', npm: '>=6'} + resolution: + { + integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==, + } + engines: { node: '>=12', npm: '>=6' } peerDependencies: '@types/node': '*' cosmiconfig: '>=7' @@ -2768,8 +3734,11 @@ packages: dev: true /cosmiconfig@8.1.3: - resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==, + } + engines: { node: '>=14' } dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2778,13 +3747,19 @@ packages: dev: true /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: '>=0.8' } hasBin: true dev: true /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } dependencies: cipher-base: 1.0.4 inherits: 2.0.4 @@ -2794,7 +3769,10 @@ packages: dev: true /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 @@ -2805,12 +3783,18 @@ packages: dev: true /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } dev: true /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: '>= 8' } dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -2818,35 +3802,56 @@ packages: dev: true /crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + resolution: + { + integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, + } dev: true /crypto-js@3.3.0: - resolution: {integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==} + resolution: + { + integrity: sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==, + } dev: true /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + } + engines: { node: '>=8' } dev: true /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, + } + engines: { node: '>=0.10' } dependencies: assert-plus: 1.0.0 dev: true /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + resolution: + { + integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, + } dev: true /death@1.1.0: - resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + resolution: + { + integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==, + } dev: true /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2857,7 +3862,10 @@ packages: dev: true /debug@3.2.6(supports-color@6.0.0): - resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} + resolution: + { + integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==, + } deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) peerDependencies: supports-color: '*' @@ -2870,7 +3878,10 @@ packages: dev: true /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2881,8 +3892,11 @@ packages: dev: true /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2894,79 +3908,121 @@ packages: dev: true /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: '>=0.10.0' } dependencies: decamelize: 1.2.0 map-obj: 1.0.1 dev: true /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } dev: true /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, + } + engines: { node: '>=10' } dev: true /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, + } + engines: { node: '>=6' } dependencies: type-detect: 4.0.8 dev: true /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: '>=4.0.0' } dev: true /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } dev: true /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } dev: true /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, + } + engines: { node: '>= 0.4' } dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 dev: true /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } dev: true /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } dev: true /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } dev: true /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: '>=8' } dev: true /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: '>=8' } dev: true /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + resolution: + { + integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==, + } hasBin: true dependencies: address: 1.2.2 @@ -2976,79 +4032,118 @@ packages: dev: true /diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, + } + engines: { node: '>=0.3.1' } dev: true /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } dev: true /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, + } + engines: { node: '>=0.3.1' } dev: true /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } dependencies: heap: 0.2.7 dev: true /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: '>=8' } dependencies: path-type: 4.0.0 dev: true /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: '>=0.10.0' } dependencies: esutils: 2.0.3 dev: true /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: '>=6.0.0' } dependencies: esutils: 2.0.3 dev: true /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: '>=8' } dependencies: is-obj: 2.0.0 dev: true /dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==, + } + engines: { node: '>=6' } dependencies: find-up: 3.0.0 minimatch: 3.1.2 dev: true /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } dev: true /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + resolution: + { + integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==, + } dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 dev: true /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } dev: true /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + resolution: + { + integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==, + } dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -3060,47 +4155,74 @@ packages: dev: true /emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + resolution: + { + integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==, + } dev: true /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } dev: true /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } dev: true /encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + resolution: + { + integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==, + } dev: true /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: '>= 0.8' } dev: true /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, + } + engines: { node: '>=8.6' } dependencies: ansi-colors: 4.1.3 dev: true /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: '>=6' } dev: true /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } dependencies: is-arrayish: 0.2.1 dev: true /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==, + } + engines: { node: '>= 0.4' } dependencies: array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 @@ -3139,12 +4261,18 @@ packages: dev: true /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + resolution: + { + integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, + } dev: true /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==, + } + engines: { node: '>= 0.4' } dependencies: get-intrinsic: 1.2.0 has: 1.0.3 @@ -3152,14 +4280,20 @@ packages: dev: true /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + resolution: + { + integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==, + } dependencies: has: 1.0.3 dev: true /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: '>= 0.4' } dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 @@ -3167,27 +4301,42 @@ packages: dev: true /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: '>=6' } dev: true /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } dev: true /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } dev: true /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } dev: true /escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==, + } + engines: { node: '>=0.12.0' } hasBin: true dependencies: esprima: 2.7.3 @@ -3199,7 +4348,10 @@ packages: dev: true /eslint-config-prettier@8.8.0(eslint@8.36.0): - resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + resolution: + { + integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, + } hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -3208,7 +4360,10 @@ packages: dev: true /eslint-config-standard-with-typescript@34.0.1(@typescript-eslint/eslint-plugin@5.56.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.36.0)(typescript@5.0.2): - resolution: {integrity: sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==} + resolution: + { + integrity: sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==, + } peerDependencies: '@typescript-eslint/eslint-plugin': ^5.43.0 eslint: ^8.0.1 @@ -3230,7 +4385,10 @@ packages: dev: true /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@15.6.1)(eslint-plugin-promise@6.1.1)(eslint@8.36.0): - resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + resolution: + { + integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==, + } peerDependencies: eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 @@ -3244,7 +4402,10 @@ packages: dev: true /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + resolution: + { + integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==, + } dependencies: debug: 3.2.7 is-core-module: 2.12.0 @@ -3254,8 +4415,11 @@ packages: dev: true /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint@8.36.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -3283,8 +4447,11 @@ packages: dev: true /eslint-plugin-es@4.1.0(eslint@8.36.0): - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==, + } + engines: { node: '>=8.10.0' } peerDependencies: eslint: '>=4.19.1' dependencies: @@ -3294,8 +4461,11 @@ packages: dev: true /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint@8.36.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 @@ -3327,8 +4497,11 @@ packages: dev: true /eslint-plugin-n@15.6.1(eslint@8.36.0): - resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} - engines: {node: '>=12.22.0'} + resolution: + { + integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==, + } + engines: { node: '>=12.22.0' } peerDependencies: eslint: '>=7.0.0' dependencies: @@ -3344,8 +4517,11 @@ packages: dev: true /eslint-plugin-promise@6.1.1(eslint@8.36.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: @@ -3353,31 +4529,43 @@ packages: dev: true /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: '>=8.0.0' } dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 dev: true /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==, + } + engines: { node: '>=6' } dependencies: eslint-visitor-keys: 1.3.0 dev: true /eslint-utils@3.0.0(eslint@8.36.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } peerDependencies: eslint: '>=5' dependencies: @@ -3386,23 +4574,35 @@ packages: dev: true /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==, + } + engines: { node: '>=4' } dev: true /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: '>=10' } dev: true /eslint-visitor-keys@3.4.0: - resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true /eslint@8.36.0: - resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.36.0) @@ -3450,8 +4650,11 @@ packages: dev: true /espree@9.5.1: - resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: acorn: 8.8.2 acorn-jsx: 5.3.2(acorn@8.8.2) @@ -3459,58 +4662,88 @@ packages: dev: true /esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==, + } + engines: { node: '>=0.10.0' } hasBin: true dev: true /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } hasBin: true dev: true /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: '>=0.10' } dependencies: estraverse: 5.3.0 dev: true /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } dependencies: estraverse: 5.3.0 dev: true /estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==, + } + engines: { node: '>=0.10.0' } dev: true /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: '>=4.0' } dev: true /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } dev: true /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } dev: true /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: '>= 0.6' } dev: true /eth-gas-reporter@0.2.25: - resolution: {integrity: sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==} + resolution: + { + integrity: sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==, + } peerDependencies: '@codechecks/client': ^0.1.0 peerDependenciesMeta: @@ -3535,13 +4768,19 @@ packages: dev: true /ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + resolution: + { + integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==, + } dependencies: js-sha3: 0.8.0 dev: true /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + resolution: + { + integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==, + } dependencies: '@types/pbkdf2': 3.1.0 '@types/secp256k1': 4.0.3 @@ -3561,7 +4800,10 @@ packages: dev: true /ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + resolution: + { + integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==, + } dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 @@ -3570,14 +4812,20 @@ packages: dev: true /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + resolution: + { + integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==, + } dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 dev: true /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + resolution: + { + integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==, + } dependencies: '@types/bn.js': 4.11.6 bn.js: 4.12.0 @@ -3589,8 +4837,11 @@ packages: dev: true /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==, + } + engines: { node: '>=10.0.0' } dependencies: '@types/bn.js': 5.1.1 bn.js: 5.2.1 @@ -3600,7 +4851,10 @@ packages: dev: true /ethers@4.0.49: - resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} + resolution: + { + integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==, + } dependencies: aes-js: 3.0.0 bn.js: 4.12.0 @@ -3614,7 +4868,10 @@ packages: dev: true /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + resolution: + { + integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==, + } dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -3652,36 +4909,51 @@ packages: dev: true /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==, + } + engines: { node: '>=6.5.0', npm: '>=3' } dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 dev: true /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==, + } + engines: { node: '>=6.5.0', npm: '>=3' } dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 dev: true /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: '>=6' } dev: true /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 dev: true /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3695,8 +4967,11 @@ packages: dev: true /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==, + } + engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -3710,8 +4985,11 @@ packages: dev: true /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==, + } + engines: { node: '>= 0.10.0' } dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -3749,25 +5027,40 @@ packages: dev: true /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } dev: true /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} + resolution: + { + integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==, + } + engines: { '0': node >=0.6.0 } dev: true /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } dev: true /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + resolution: + { + integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==, + } dev: true /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, + } + engines: { node: '>=8.6.0' } dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -3777,43 +5070,64 @@ packages: dev: true /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } dev: true /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } dev: true /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } dependencies: reusify: 1.0.4 dev: true /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: '>=8' } dependencies: escape-string-regexp: 1.0.5 dev: true /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } dependencies: flat-cache: 3.0.4 dev: true /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: '>=8' } dependencies: to-regex-range: 5.0.1 dev: true /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + } + engines: { node: '>= 0.8' } dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -3827,75 +5141,108 @@ packages: dev: true /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==, + } + engines: { node: '>=4.0.0' } dependencies: array-back: 3.1.0 dev: true /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: '>=4' } dependencies: locate-path: 2.0.0 dev: true /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, + } + engines: { node: '>=6' } dependencies: locate-path: 3.0.0 dev: true /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } dependencies: locate-path: 5.0.0 path-exists: 4.0.0 dev: true /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } dependencies: locate-path: 6.0.0 path-exists: 4.0.0 dev: true /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } dependencies: flatted: 3.2.7 rimraf: 3.0.2 dev: true /flat@4.1.1: - resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} + resolution: + { + integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==, + } hasBin: true dependencies: is-buffer: 2.0.5 dev: true /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true dev: true /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } dev: true /fmix@0.1.0: - resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + resolution: + { + integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==, + } dependencies: imul: 1.0.1 dev: true /follow-redirects@1.15.2(debug@4.3.4): - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, + } + engines: { node: '>=4.0' } peerDependencies: debug: '*' peerDependenciesMeta: @@ -3906,18 +5253,27 @@ packages: dev: true /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } dependencies: is-callable: 1.2.7 dev: true /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + resolution: + { + integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==, + } dev: true /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + resolution: + { + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==, + } + engines: { node: '>= 0.12' } dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -3925,8 +5281,11 @@ packages: dev: true /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} + resolution: + { + integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==, + } + engines: { node: '>= 0.12' } dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -3934,8 +5293,11 @@ packages: dev: true /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: '>= 6' } dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -3943,21 +5305,33 @@ packages: dev: true /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: '>= 0.6' } dev: true /fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + resolution: + { + integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==, + } dev: true /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: '>= 0.6' } dev: true /fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + resolution: + { + integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==, + } dependencies: graceful-fs: 4.2.11 jsonfile: 2.4.0 @@ -3967,8 +5341,11 @@ packages: dev: true /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -3976,8 +5353,11 @@ packages: dev: true /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, + } + engines: { node: '>=14.14' } dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -3985,8 +5365,11 @@ packages: dev: true /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, + } + engines: { node: '>=6 <7 || >=8' } dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 @@ -3994,8 +5377,11 @@ packages: dev: true /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: '>=6 <7 || >=8' } dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 @@ -4003,8 +5389,11 @@ packages: dev: true /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: '>=10' } dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 @@ -4013,16 +5402,25 @@ packages: dev: true /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + resolution: + { + integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==, + } dev: true /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } dev: true /fsevents@2.1.3: - resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] deprecated: '"Please update to latest v2.3 or v2.2"' requiresBuild: true @@ -4030,20 +5428,29 @@ packages: optional: true /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] requiresBuild: true dev: true optional: true /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + resolution: + { + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + } dev: true /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -4052,24 +5459,39 @@ packages: dev: true /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + resolution: + { + integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==, + } dev: true /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } dev: true /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } dev: true /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + resolution: + { + integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==, + } dev: true /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + resolution: + { + integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==, + } dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -4077,8 +5499,11 @@ packages: dev: true /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, + } + engines: { node: '>=6.9.0' } hasBin: true dependencies: '@hutson/parse-repository-url': 3.0.2 @@ -4088,31 +5513,46 @@ packages: dev: true /get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==, + } + engines: { node: '>=4' } dev: true /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } dev: true /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 dev: true /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + resolution: + { + integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==, + } dependencies: assert-plus: 1.0.0 dev: true /ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + resolution: + { + integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==, + } hasBin: true dependencies: chalk: 2.4.2 @@ -4120,8 +5560,11 @@ packages: dev: true /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + } + engines: { node: '>=10' } hasBin: true dependencies: dargs: 7.0.0 @@ -4132,16 +5575,22 @@ packages: dev: true /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, + } + engines: { node: '>=4' } dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 dev: true /git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==, + } + engines: { node: '>=10' } hasBin: true dependencies: meow: 8.1.2 @@ -4149,27 +5598,39 @@ packages: dev: true /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + resolution: + { + integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, + } dependencies: ini: 1.3.8 dev: true /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } dependencies: is-glob: 4.0.3 dev: true /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } dependencies: is-glob: 4.0.3 dev: true /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + resolution: + { + integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==, + } dependencies: inflight: 1.0.6 inherits: 2.0.4 @@ -4179,7 +5640,10 @@ packages: dev: true /glob@7.1.3: - resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} + resolution: + { + integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==, + } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4190,7 +5654,10 @@ packages: dev: true /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + resolution: + { + integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, + } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4201,7 +5668,10 @@ packages: dev: true /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + resolution: + { + integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, + } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4212,7 +5682,10 @@ packages: dev: true /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4223,8 +5696,11 @@ packages: dev: true /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: '>=12' } dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4234,22 +5710,31 @@ packages: dev: true /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: '>=4' } dependencies: ini: 1.3.8 dev: true /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, + } + engines: { node: '>=6' } dependencies: global-prefix: 3.0.0 dev: true /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, + } + engines: { node: '>=6' } dependencies: ini: 1.3.8 kind-of: 6.0.3 @@ -4257,22 +5742,31 @@ packages: dev: true /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: '>=8' } dependencies: type-fest: 0.20.2 dev: true /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, + } + engines: { node: '>= 0.4' } dependencies: define-properties: 1.2.0 dev: true /globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==, + } + engines: { node: '>=8' } dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 @@ -4285,8 +5779,11 @@ packages: dev: true /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: '>=10' } dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -4297,27 +5794,42 @@ packages: dev: true /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } dependencies: get-intrinsic: 1.2.0 dev: true /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } dev: true /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } dev: true /growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} + resolution: + { + integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==, + } + engines: { node: '>=4.x' } dev: true /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} + resolution: + { + integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, + } + engines: { node: '>=0.4.7' } hasBin: true dependencies: minimist: 1.2.8 @@ -4329,13 +5841,19 @@ packages: dev: true /har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==, + } + engines: { node: '>=4' } dev: true /har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==, + } + engines: { node: '>=6' } deprecated: this library is no longer supported dependencies: ajv: 6.12.6 @@ -4343,12 +5861,18 @@ packages: dev: true /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: '>=6' } dev: true /hardhat-deploy@0.11.26: - resolution: {integrity: sha512-GvnkD8v6q0coCQbwZNeUcO3ab1zz36FKsqzNdm6EcnVoAfXVkFpdA0pgJ7/Rk3+Lv5709xOtbneFOyoukUOhWQ==} + resolution: + { + integrity: sha512-GvnkD8v6q0coCQbwZNeUcO3ab1zz36FKsqzNdm6EcnVoAfXVkFpdA0pgJ7/Rk3+Lv5709xOtbneFOyoukUOhWQ==, + } dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -4381,7 +5905,10 @@ packages: dev: true /hardhat-gas-reporter@1.0.9(hardhat@2.13.0): - resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} + resolution: + { + integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==, + } peerDependencies: hardhat: ^2.0.2 dependencies: @@ -4394,8 +5921,11 @@ packages: dev: true /hardhat@2.13.0(ts-node@10.9.1)(typescript@5.0.2): - resolution: {integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==, + } + engines: { node: '>=14.0.0' } hasBin: true peerDependencies: ts-node: '*' @@ -4465,57 +5995,87 @@ packages: dev: true /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } dev: true /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==, + } + engines: { node: '>=0.10.0' } dev: true /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } dev: true /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } dev: true /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + resolution: + { + integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, + } dependencies: get-intrinsic: 1.2.0 dev: true /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: '>= 0.4' } dev: true /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: '>= 0.4' } dev: true /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + } + engines: { node: '>= 0.4' } dependencies: has-symbols: 1.0.3 dev: true /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + } + engines: { node: '>= 0.4.0' } dependencies: function-bind: 1.1.1 dev: true /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, + } + engines: { node: '>=4' } dependencies: inherits: 2.0.4 readable-stream: 3.6.2 @@ -4523,30 +6083,45 @@ packages: dev: true /hash.js@1.1.3: - resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} + resolution: + { + integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==, + } dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true dev: true /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } dev: true /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 @@ -4554,19 +6129,28 @@ packages: dev: true /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } dev: true /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, + } + engines: { node: '>=10' } dependencies: lru-cache: 6.0.0 dev: true /http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==, + } + engines: { node: '>=6.0.0' } dependencies: caseless: 0.12.0 concat-stream: 1.6.2 @@ -4575,8 +6159,11 @@ packages: dev: true /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: '>= 0.8' } dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -4586,14 +6173,20 @@ packages: dev: true /http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + resolution: + { + integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==, + } dependencies: '@types/node': 10.17.60 dev: true /http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} + resolution: + { + integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==, + } + engines: { node: '>=0.8', npm: '>=1.3.7' } dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 @@ -4601,8 +6194,11 @@ packages: dev: true /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: '>= 6' } dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) @@ -4611,87 +6207,135 @@ packages: dev: true /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } dev: true /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + resolution: + { + integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==, + } + engines: { node: '>=14.18.0' } dev: true /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: '>=14' } hasBin: true dev: true /hyperlinker@1.0.0: - resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==, + } + engines: { node: '>=4' } dev: true /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } dependencies: safer-buffer: 2.1.2 dev: true /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } dev: true /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: '>= 4' } dev: true /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + resolution: + { + integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==, + } dev: true /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: '>=6' } dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 dev: true /imul@1.0.1: - resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==, + } + engines: { node: '>=0.10.0' } dev: true /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } dev: true /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } dev: true /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } dev: true /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } dev: true /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, + } + engines: { node: '>= 0.4' } dependencies: get-intrinsic: 1.2.0 has: 1.0.3 @@ -4699,23 +6343,35 @@ packages: dev: true /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + } + engines: { node: '>= 0.10' } dev: true /io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + resolution: + { + integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==, + } dependencies: fp-ts: 1.19.3 dev: true /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } dev: true /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + resolution: + { + integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, + } dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 @@ -4723,176 +6379,266 @@ packages: dev: true /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } dev: true /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } dependencies: has-bigints: 1.0.2 dev: true /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: '>=8' } dependencies: binary-extensions: 2.2.0 dev: true /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: true /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: '>=4' } dev: true /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } dev: true /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + resolution: + { + integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==, + } dependencies: has: 1.0.3 dev: true /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 dev: true /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } hasBin: true dev: true /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } dev: true /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, + } + engines: { node: '>=4' } dev: true /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } dev: true /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: '>=12' } dev: true /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } dependencies: is-extglob: 2.1.1 dev: true /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==, + } + engines: { node: '>=6.5.0', npm: '>=3' } dev: true /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, + } + engines: { node: '>= 0.4' } dev: true /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 dev: true /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } dev: true /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: '>=8' } dev: true /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: '>=8' } dev: true /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: '>=0.10.0' } dev: true /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + } + engines: { node: '>=8' } dev: true /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: true /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + resolution: + { + integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, + } dependencies: call-bind: 1.0.2 dev: true /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } dev: true /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 dev: true /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: '>= 0.4' } dependencies: has-symbols: 1.0.3 dev: true /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, + } + engines: { node: '>=0.10.0' } dependencies: text-extensions: 1.9.0 dev: true /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, + } + engines: { node: '>= 0.4' } dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -4902,57 +6648,93 @@ packages: dev: true /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + resolution: + { + integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, + } dev: true /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: '>=10' } dev: true /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } dependencies: call-bind: 1.0.2 dev: true /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } dependencies: is-docker: 2.2.1 dev: true /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } dev: true /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } dev: true /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + resolution: + { + integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==, + } dev: true /js-sdsl@4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + resolution: + { + integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==, + } dev: true /js-sha3@0.5.7: - resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + resolution: + { + integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==, + } dev: true /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + resolution: + { + integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, + } dev: true /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } dev: true /js-yaml@3.13.1: - resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + resolution: + { + integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==, + } hasBin: true dependencies: argparse: 1.0.10 @@ -4960,7 +6742,10 @@ packages: dev: true /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true dependencies: argparse: 1.0.10 @@ -4968,65 +6753,104 @@ packages: dev: true /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true dependencies: argparse: 2.0.1 dev: true /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + resolution: + { + integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==, + } dev: true /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } dev: true /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } dev: true /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } dev: true /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } dev: true /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } dev: true /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } dev: true /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } dev: true /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } hasBin: true dependencies: minimist: 1.2.8 dev: true /jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + resolution: + { + integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==, + } optionalDependencies: graceful-fs: 4.2.11 dev: true /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } optionalDependencies: graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } dependencies: universalify: 2.0.0 optionalDependencies: @@ -5034,17 +6858,26 @@ packages: dev: true /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { '0': node >= 0.2.0 } dev: true /jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + resolution: + { + integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==, + } dev: true /jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==, + } + engines: { node: '>=0.6.0' } dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 @@ -5053,8 +6886,11 @@ packages: dev: true /keccak@3.0.3: - resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==, + } + engines: { node: '>=10.0.0' } requiresBuild: true dependencies: node-addon-api: 2.0.2 @@ -5063,70 +6899,103 @@ packages: dev: true /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: '>=0.10.0' } dev: true /klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + resolution: + { + integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==, + } optionalDependencies: graceful-fs: 4.2.11 dev: true /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } dev: true /level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==, + } + engines: { node: '>=12' } dev: true /level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==, + } + engines: { node: '>=12' } dependencies: buffer: 6.0.3 module-error: 1.0.2 dev: true /level@8.0.0: - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==, + } + engines: { node: '>=12' } dependencies: browser-level: 1.0.1 classic-level: 1.3.0 dev: true /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: '>= 0.8.0' } dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 dev: true /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 dev: true /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: '>=10' } dev: true /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } dev: true /lint-staged@13.2.0: - resolution: {integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==} - engines: {node: ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==, + } + engines: { node: ^14.13.1 || >=16.0.0 } hasBin: true dependencies: chalk: 5.2.0 @@ -5148,8 +7017,11 @@ packages: dev: true /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==, + } + engines: { node: ^14.13.1 || >=16.0.0 } peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: @@ -5167,8 +7039,11 @@ packages: dev: true /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 @@ -5177,105 +7052,165 @@ packages: dev: true /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: '>=4' } dependencies: p-locate: 2.0.0 path-exists: 3.0.0 dev: true /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, + } + engines: { node: '>=6' } dependencies: p-locate: 3.0.0 path-exists: 3.0.0 dev: true /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } dependencies: p-locate: 4.1.0 dev: true /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } dependencies: p-locate: 5.0.0 dev: true /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } dev: true /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + resolution: + { + integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==, + } dev: true /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + resolution: + { + integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, + } dev: true /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } dev: true /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + resolution: + { + integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, + } dev: true /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } dev: true /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + resolution: + { + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, + } dev: true /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + resolution: + { + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, + } dev: true /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } dev: true /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + resolution: + { + integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, + } dev: true /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } dev: true /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + resolution: + { + integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, + } dev: true /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } dev: true /log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==, + } + engines: { node: '>=8' } dependencies: chalk: 2.4.2 dev: true /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 dev: true /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, + } + engines: { node: '>=10' } dependencies: ansi-escapes: 4.3.2 cli-cursor: 3.1.0 @@ -5284,57 +7219,90 @@ packages: dev: true /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + resolution: + { + integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==, + } dependencies: get-func-name: 2.0.0 dev: true /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } dependencies: yallist: 3.1.1 dev: true /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: '>=10' } dependencies: yallist: 4.0.0 dev: true /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + resolution: + { + integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==, + } dev: true /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } dev: true /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: '>=0.10.0' } dev: true /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: '>=8' } dev: true /markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + resolution: + { + integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==, + } dev: true /match-all@1.2.6: - resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} + resolution: + { + integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==, + } dev: true /mcl-wasm@0.7.9: - resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} - engines: {node: '>=8.9.0'} + resolution: + { + integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==, + } + engines: { node: '>=8.9.0' } dev: true /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } dependencies: hash-base: 3.1.0 inherits: 2.0.4 @@ -5342,13 +7310,19 @@ packages: dev: true /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: '>= 0.6' } dev: true /memory-level@1.0.0: - resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==, + } + engines: { node: '>=12' } dependencies: abstract-level: 1.0.3 functional-red-black-tree: 1.0.1 @@ -5356,13 +7330,19 @@ packages: dev: true /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, + } + engines: { node: '>= 0.10.0' } dev: true /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, + } + engines: { node: '>=10' } dependencies: '@types/minimist': 1.2.2 camelcase-keys: 6.2.2 @@ -5378,21 +7358,33 @@ packages: dev: true /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + resolution: + { + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, + } dev: true /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } dev: true /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } dev: true /merkletreejs@0.3.9: - resolution: {integrity: sha512-NjlATjJr4NEn9s8v/VEHhgwRWaE1eA/Une07d9SEqKzULJi1Wsh0Y3svwJdP2bYLMmgSBHzOrNydMWM1NN9VeQ==} - engines: {node: '>= 7.6.0'} + resolution: + { + integrity: sha512-NjlATjJr4NEn9s8v/VEHhgwRWaE1eA/Une07d9SEqKzULJi1Wsh0Y3svwJdP2bYLMmgSBHzOrNydMWM1NN9VeQ==, + } + engines: { node: '>= 7.6.0' } dependencies: bignumber.js: 9.1.1 buffer-reverse: 1.0.1 @@ -5402,88 +7394,133 @@ packages: dev: true /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: '>= 0.6' } dev: true /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: '>=8.6' } dependencies: braces: 3.0.2 picomatch: 2.3.1 dev: true /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } dev: true /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } dependencies: mime-db: 1.52.0 dev: true /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: '>=4' } hasBin: true dev: true /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } dev: true /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: '>=12' } dev: true /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } dev: true /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } dev: true /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + resolution: + { + integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, + } dev: true /minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + resolution: + { + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==, + } dependencies: brace-expansion: 1.1.11 dev: true /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } dependencies: brace-expansion: 1.1.11 dev: true /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, + } + engines: { node: '>=10' } dependencies: brace-expansion: 2.0.1 dev: true /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: '>=10' } dependencies: brace-expansion: 2.0.1 dev: true /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: '>= 6' } dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 @@ -5491,38 +7528,56 @@ packages: dev: true /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } dev: true /mkdirp@0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + resolution: + { + integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==, + } hasBin: true dependencies: minimist: 1.2.8 dev: true /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } hasBin: true dependencies: minimist: 1.2.8 dev: true /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: '>=10' } hasBin: true dev: true /mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + resolution: + { + integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==, + } dependencies: obliterator: 2.0.4 dev: true /mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, + } + engines: { node: '>= 14.0.0' } hasBin: true dependencies: ansi-colors: 4.1.1 @@ -5549,8 +7604,11 @@ packages: dev: true /mocha@7.1.2: - resolution: {integrity: sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==, + } + engines: { node: '>= 8.10.0' } hasBin: true dependencies: ansi-colors: 3.2.3 @@ -5580,8 +7638,11 @@ packages: dev: true /mocha@7.2.0: - resolution: {integrity: sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==, + } + engines: { node: '>= 8.10.0' } hasBin: true dependencies: ansi-colors: 3.2.3 @@ -5611,33 +7672,54 @@ packages: dev: true /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, + } + engines: { node: '>=0.10.0' } dev: true /module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==, + } + engines: { node: '>=10' } dev: true /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } dev: true /ms@2.1.1: - resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + resolution: + { + integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==, + } dev: true /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } dev: true /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } dev: true /murmur-128@0.2.1: - resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + resolution: + { + integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==, + } dependencies: encode-utf8: 1.0.3 fmix: 0.1.0 @@ -5645,68 +7727,107 @@ packages: dev: true /nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true dev: true /napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + resolution: + { + integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==, + } dev: true /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } dev: true /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } dev: true /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } dev: true /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } dev: true /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + resolution: + { + integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, + } dev: true /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + resolution: + { + integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, + } dependencies: lodash: 4.17.21 dev: true /node-environment-flags@1.0.6: - resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + resolution: + { + integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==, + } dependencies: object.getownpropertydescriptors: 2.1.5 semver: 5.7.1 dev: true /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + resolution: + { + integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==, + } hasBin: true dev: true /nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} + resolution: + { + integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==, + } + engines: { node: '>=12.19' } dev: true /nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + resolution: + { + integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==, + } hasBin: true dependencies: abbrev: 1.0.9 dev: true /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } dependencies: hosted-git-info: 2.8.9 resolve: 1.22.2 @@ -5715,8 +7836,11 @@ packages: dev: true /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, + } + engines: { node: '>=10' } dependencies: hosted-git-info: 4.1.0 is-core-module: 2.12.0 @@ -5725,53 +7849,80 @@ packages: dev: true /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } dev: true /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } dependencies: path-key: 3.1.1 dev: true /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: path-key: 4.0.0 dev: true /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==, + } + engines: { node: '>=6.5.0', npm: '>=3' } dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 dev: true /oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + resolution: + { + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==, + } dev: true /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } dev: true /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + resolution: + { + integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, + } dev: true /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: '>= 0.4' } dev: true /object.assign@4.1.0: - resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==, + } + engines: { node: '>= 0.4' } dependencies: define-properties: 1.2.0 function-bind: 1.1.1 @@ -5780,8 +7931,11 @@ packages: dev: true /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -5790,8 +7944,11 @@ packages: dev: true /object.getownpropertydescriptors@2.1.5: - resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==, + } + engines: { node: '>= 0.8' } dependencies: array.prototype.reduce: 1.0.5 call-bind: 1.0.2 @@ -5800,8 +7957,11 @@ packages: dev: true /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -5809,39 +7969,57 @@ packages: dev: true /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + resolution: + { + integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, + } dev: true /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } dependencies: ee-first: 1.1.1 dev: true /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } dependencies: wrappy: 1.0.2 dev: true /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } dependencies: mimic-fn: 2.1.0 dev: true /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: '>=12' } dependencies: mimic-fn: 4.0.0 dev: true /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 @@ -5849,8 +8027,11 @@ packages: dev: true /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: '>= 0.8.0' } dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -5861,8 +8042,11 @@ packages: dev: true /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, + } + engines: { node: '>= 0.8.0' } dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -5873,102 +8057,150 @@ packages: dev: true /ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + resolution: + { + integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==, + } dev: true /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: '>=0.10.0' } dev: true /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: '>=4' } dependencies: p-try: 1.0.0 dev: true /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } dependencies: p-try: 2.2.0 dev: true /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } dependencies: yocto-queue: 0.1.0 dev: true /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: '>=4' } dependencies: p-limit: 1.3.0 dev: true /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, + } + engines: { node: '>=6' } dependencies: p-limit: 2.3.0 dev: true /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } dependencies: p-limit: 2.3.0 dev: true /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } dependencies: p-limit: 3.1.0 dev: true /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: '>=10' } dependencies: aggregate-error: 3.1.0 dev: true /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: '>=4' } dev: true /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } dev: true /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } dependencies: callsites: 3.1.0 dev: true /parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + resolution: + { + integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==, + } dev: true /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 dev: true /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } dependencies: '@babel/code-frame': 7.21.4 error-ex: 1.3.2 @@ -5977,62 +8209,98 @@ packages: dev: true /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } dev: true /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: '>=4' } dev: true /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } dev: true /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } dev: true /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } dev: true /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: '>=12' } dev: true /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } dev: true /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + resolution: + { + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, + } dev: true /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } dependencies: pify: 3.0.0 dev: true /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } dev: true /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } dev: true /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, + } + engines: { node: '>=0.12' } dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 @@ -6042,60 +8310,93 @@ packages: dev: true /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + resolution: + { + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, + } dev: true /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } dev: true /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: '>=0.10' } hasBin: true dev: true /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } dev: true /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } dev: true /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: '>=6' } dev: true /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==, + } + engines: { node: '>=4' } dev: true /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: '>= 0.8.0' } dev: true /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } dev: true /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: '>=6.0.0' } dependencies: fast-diff: 1.2.0 dev: true /prettier-plugin-solidity@1.1.3(prettier@2.8.7): - resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==, + } + engines: { node: '>=12' } peerDependencies: prettier: '>=2.3.0 || >=3.0.0-alpha.0' dependencies: @@ -6106,31 +8407,46 @@ packages: dev: true /prettier@2.8.7: - resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==, + } + engines: { node: '>=10.13.0' } hasBin: true dev: true /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } dev: true /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + resolution: + { + integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, + } dependencies: asap: 2.0.6 dev: true /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } dependencies: kleur: 3.0.3 sisteransi: 1.0.5 dev: true /proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + resolution: + { + integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==, + } dependencies: graceful-fs: 4.2.11 retry: 0.12.0 @@ -6138,69 +8454,105 @@ packages: dev: true /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: '>= 0.10' } dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 dev: true /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + resolution: + { + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, + } dev: true /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: '>=6' } dev: true /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + resolution: + { + integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, + } + engines: { node: '>=0.6.0', teleport: '>=0.2.0' } dev: true /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: '>=0.6' } dependencies: side-channel: 1.0.4 dev: true /qs@6.11.1: - resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==, + } + engines: { node: '>=0.6' } dependencies: side-channel: 1.0.4 dev: true /qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==, + } + engines: { node: '>=0.6' } dev: true /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } dev: true /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: '>=8' } dev: true /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } dependencies: safe-buffer: 5.2.1 dev: true /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } dev: true /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==, + } + engines: { node: '>= 0.8' } dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -6209,8 +8561,11 @@ packages: dev: true /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: '>= 0.8' } dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -6219,16 +8574,22 @@ packages: dev: true /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, + } + engines: { node: '>=4' } dependencies: find-up: 2.1.0 read-pkg: 3.0.0 dev: true /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: '>=8' } dependencies: find-up: 4.1.0 read-pkg: 5.2.0 @@ -6236,8 +8597,11 @@ packages: dev: true /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 @@ -6245,8 +8609,11 @@ packages: dev: true /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: '>=8' } dependencies: '@types/normalize-package-data': 2.4.1 normalize-package-data: 2.5.0 @@ -6255,7 +8622,10 @@ packages: dev: true /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -6267,8 +8637,11 @@ packages: dev: true /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } dependencies: inherits: 2.0.4 string_decoder: 1.3.0 @@ -6276,49 +8649,70 @@ packages: dev: true /readdirp@3.2.0: - resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==, + } + engines: { node: '>= 8' } dependencies: picomatch: 2.3.1 dev: true /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: '>=8.10.0' } dependencies: picomatch: 2.3.1 dev: true /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, + } + engines: { node: '>= 0.10' } dependencies: resolve: 1.22.2 dev: true /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, + } + engines: { node: '>=6.0.0' } dependencies: minimatch: 3.1.2 dev: true /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 dev: true /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==, + } + engines: { node: '>=6' } dev: true /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -6326,27 +8720,39 @@ packages: dev: true /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, + } + engines: { node: '>=8' } dev: true /req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==, + } + engines: { node: '>=4' } dependencies: req-from: 2.0.0 dev: true /req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==, + } + engines: { node: '>=4' } dependencies: resolve-from: 3.0.0 dev: true /request-promise-core@1.1.4(request@2.88.2): - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==, + } + engines: { node: '>=0.10.0' } peerDependencies: request: ^2.34 dependencies: @@ -6355,8 +8761,11 @@ packages: dev: true /request-promise-native@1.0.9(request@2.88.2): - resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==, + } + engines: { node: '>=0.12.0' } deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 peerDependencies: request: ^2.34 @@ -6368,8 +8777,11 @@ packages: dev: true /request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==, + } + engines: { node: '>= 6' } deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 @@ -6395,53 +8807,83 @@ packages: dev: true /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } dev: true /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } dev: true /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } dev: true /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==, + } + engines: { node: '>=4' } dev: true /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } dev: true /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } dev: true /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, + } + engines: { node: '>=8' } dependencies: global-dirs: 0.1.1 dev: true /resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolution: + { + integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==, + } dev: true /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolution: + { + integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==, + } dependencies: path-parse: 1.0.7 dev: true /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + resolution: + { + integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==, + } hasBin: true dependencies: is-core-module: 2.12.0 @@ -6450,87 +8892,132 @@ packages: dev: true /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } dependencies: onetime: 5.1.2 signal-exit: 3.0.7 dev: true /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: '>= 4' } dev: true /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } dev: true /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + resolution: + { + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, + } dev: true /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + } hasBin: true dependencies: glob: 7.2.0 dev: true /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } hasBin: true dependencies: glob: 7.2.3 dev: true /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } dependencies: hash-base: 3.1.0 inherits: 2.0.4 dev: true /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + resolution: + { + integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==, + } hasBin: true dependencies: bn.js: 5.2.1 dev: true /run-parallel-limit@1.1.0: - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + resolution: + { + integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==, + } dependencies: queue-microtask: 1.2.3 dev: true /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } dependencies: queue-microtask: 1.2.3 dev: true /rustbn.js@0.2.0: - resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + resolution: + { + integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==, + } dev: true /rxjs@7.8.0: - resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + resolution: + { + integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==, + } dependencies: tslib: 2.5.0 dev: true /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } dev: true /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } dev: true /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + resolution: + { + integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, + } dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 @@ -6538,11 +9025,17 @@ packages: dev: true /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } dev: true /sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + resolution: + { + integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==, + } hasBin: true dependencies: abbrev: 1.0.9 @@ -6562,16 +9055,25 @@ packages: dev: true /scrypt-js@2.0.4: - resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} + resolution: + { + integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==, + } dev: true /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + resolution: + { + integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, + } dev: true /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==, + } + engines: { node: '>=10.0.0' } requiresBuild: true dependencies: elliptic: 6.5.4 @@ -6580,34 +9082,49 @@ packages: dev: true /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + resolution: + { + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, + } hasBin: true dev: true /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + resolution: + { + integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, + } hasBin: true dev: true /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, + } + engines: { node: '>=10' } hasBin: true dependencies: lru-cache: 6.0.0 dev: true /semver@7.4.0: - resolution: {integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==, + } + engines: { node: '>=10' } hasBin: true dependencies: lru-cache: 6.0.0 dev: true /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + } + engines: { node: '>= 0.8.0' } dependencies: debug: 2.6.9 depd: 2.0.0 @@ -6627,14 +9144,20 @@ packages: dev: true /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + resolution: + { + integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, + } dependencies: randombytes: 2.1.0 dev: true /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + } + engines: { node: '>= 0.8.0' } dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -6645,23 +9168,38 @@ packages: dev: true /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } dev: true /setimmediate@1.0.4: - resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} + resolution: + { + integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==, + } dev: true /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } dev: true /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } dev: true /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } hasBin: true dependencies: inherits: 2.0.4 @@ -6669,27 +9207,39 @@ packages: dev: true /sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + resolution: + { + integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==, + } dependencies: charenc: 0.0.2 crypt: 0.0.2 dev: true /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } dependencies: shebang-regex: 3.0.0 dev: true /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } dev: true /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, + } + engines: { node: '>=4' } hasBin: true dependencies: glob: 7.2.3 @@ -6698,7 +9248,10 @@ packages: dev: true /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + } dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 @@ -6706,21 +9259,33 @@ packages: dev: true /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } dev: true /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } dev: true /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } dev: true /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==, + } + engines: { node: '>=8' } dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 @@ -6728,8 +9293,11 @@ packages: dev: true /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: '>=10' } dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 @@ -6737,16 +9305,22 @@ packages: dev: true /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: '>=12' } dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 dev: true /solc@0.7.3(debug@4.3.4): - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==, + } + engines: { node: '>=8.0.0' } hasBin: true dependencies: command-exists: 1.2.9 @@ -6763,7 +9337,10 @@ packages: dev: true /solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.1.3)(prettier@2.8.7): - resolution: {integrity: sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==} + resolution: + { + integrity: sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==, + } peerDependencies: prettier: ^1.15.0 || ^2.0.0 prettier-plugin-solidity: ^1.0.0-alpha.14 @@ -6774,7 +9351,10 @@ packages: dev: true /solhint@3.4.1: - resolution: {integrity: sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==} + resolution: + { + integrity: sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==, + } hasBin: true dependencies: '@solidity-parser/parser': 0.16.0 @@ -6799,15 +9379,24 @@ packages: dev: true /solidity-ast@0.4.46: - resolution: {integrity: sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==} + resolution: + { + integrity: sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==, + } dev: true /solidity-comments-extractor@0.0.7: - resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + resolution: + { + integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==, + } dev: true /solidity-coverage@0.8.2(hardhat@2.13.0): - resolution: {integrity: sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==} + resolution: + { + integrity: sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==, + } hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -6838,15 +9427,21 @@ packages: dev: true /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true /source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==, + } + engines: { node: '>=0.8.0' } requiresBuild: true dependencies: amdefine: 1.0.1 @@ -6854,56 +9449,86 @@ packages: optional: true /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } dev: true /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 dev: true /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + } dev: true /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 dev: true /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + resolution: + { + integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, + } dev: true /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + resolution: + { + integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, + } dependencies: readable-stream: 3.6.2 dev: true /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } dependencies: through: 2.3.8 dev: true /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } dev: true /squirrelly@8.0.8: - resolution: {integrity: sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==, + } + engines: { node: '>=6.0.0' } dev: true /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==, + } + engines: { node: '>=0.10.0' } hasBin: true dependencies: asn1: 0.2.6 @@ -6918,15 +9543,21 @@ packages: dev: true /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==, + } + engines: { node: '>=6' } dependencies: type-fest: 0.7.1 dev: true /standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==, + } + engines: { node: '>=10' } hasBin: true dependencies: chalk: 2.4.2 @@ -6946,40 +9577,61 @@ packages: dev: true /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: '>= 0.8' } dev: true /stealthy-require@1.1.1: - resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==, + } + engines: { node: '>=0.10.0' } dev: true /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: '>=10.0.0' } dev: true /string-argv@0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} - engines: {node: '>=0.6.19'} + resolution: + { + integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==, + } + engines: { node: '>=0.6.19' } dev: true /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + resolution: + { + integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==, + } dev: true /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, + } + engines: { node: '>=4' } dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 dev: true /string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==, + } + engines: { node: '>=6' } dependencies: emoji-regex: 7.0.3 is-fullwidth-code-point: 2.0.0 @@ -6987,8 +9639,11 @@ packages: dev: true /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 @@ -6996,8 +9651,11 @@ packages: dev: true /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 @@ -7005,8 +9663,11 @@ packages: dev: true /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==, + } + engines: { node: '>= 0.4' } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -7014,7 +9675,10 @@ packages: dev: true /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + resolution: + { + integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==, + } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -7022,7 +9686,10 @@ packages: dev: true /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + resolution: + { + integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==, + } dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -7030,132 +9697,195 @@ packages: dev: true /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } dependencies: safe-buffer: 5.1.2 dev: true /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } dependencies: safe-buffer: 5.2.1 dev: true /stringify-package@1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + resolution: + { + integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==, + } deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json dev: true /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, + } + engines: { node: '>=4' } dependencies: ansi-regex: 3.0.1 dev: true /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, + } + engines: { node: '>=6' } dependencies: ansi-regex: 4.1.1 dev: true /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } dependencies: ansi-regex: 5.0.1 dev: true /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==, + } + engines: { node: '>=12' } dependencies: ansi-regex: 6.0.1 dev: true /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } dev: true /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } dev: true /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: '>=12' } dev: true /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==, + } + engines: { node: '>=6.5.0', npm: '>=3' } dependencies: is-hex-prefixed: 1.0.0 dev: true /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } dependencies: min-indent: 1.0.1 dev: true /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: '>=0.10.0' } dev: true /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } dev: true /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==, + } + engines: { node: '>=0.8.0' } dependencies: has-flag: 1.0.0 dev: true /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } dependencies: has-flag: 3.0.0 dev: true /supports-color@6.0.0: - resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==, + } + engines: { node: '>=6' } dependencies: has-flag: 3.0.0 dev: true /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } dependencies: has-flag: 4.0.0 dev: true /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } dependencies: has-flag: 4.0.0 dev: true /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } dev: true /sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==, + } + engines: { node: '>=8.0.0' } dependencies: http-response-object: 3.0.2 sync-rpc: 1.3.6 @@ -7163,14 +9893,20 @@ packages: dev: true /sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + resolution: + { + integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==, + } dependencies: get-port: 3.2.0 dev: true /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==, + } + engines: { node: '>=8.0.0' } dependencies: array-back: 4.0.2 deep-extend: 0.6.0 @@ -7179,8 +9915,11 @@ packages: dev: true /table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, + } + engines: { node: '>=10.0.0' } dependencies: ajv: 8.12.0 lodash.truncate: 4.4.2 @@ -7190,7 +9929,10 @@ packages: dev: true /tenderly@0.4.0(ts-node@10.9.1)(typescript@5.0.2): - resolution: {integrity: sha512-wZgQ8Z1utc/QoAfVvMHO/ONLXJ3Vw3yjzJzpMmMUR4kvUu861mI7+mL9R1aeUuXI06cv81LZH96Vh+AOseIYoA==} + resolution: + { + integrity: sha512-wZgQ8Z1utc/QoAfVvMHO/ONLXJ3Vw3yjzJzpMmMUR4kvUu861mI7+mL9R1aeUuXI06cv81LZH96Vh+AOseIYoA==, + } peerDependencies: ts-node: '*' typescript: '*' @@ -7217,17 +9959,26 @@ packages: dev: true /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, + } + engines: { node: '>=0.10' } dev: true /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } dev: true /then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==, + } + engines: { node: '>=6.0.0' } dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 @@ -7243,61 +9994,91 @@ packages: dev: true /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } dependencies: readable-stream: 3.6.2 dev: true /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } dev: true /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: '>=0.6.0' } dependencies: os-tmpdir: 1.0.2 dev: true /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } dependencies: is-number: 7.0.0 dev: true /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } dev: true /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==, + } + engines: { node: '>=0.8' } dependencies: psl: 1.9.0 punycode: 2.3.0 dev: true /treeify@1.1.0: - resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==, + } + engines: { node: '>=0.6' } dev: true /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: '>=8' } dev: true /ts-command-line-args@2.4.2(typescript@5.0.2): - resolution: {integrity: sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==} + resolution: + { + integrity: sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==, + } hasBin: true dependencies: '@morgan-stanley/ts-mocking-bird': 0.6.4(typescript@5.0.2) @@ -7312,7 +10093,10 @@ packages: dev: true /ts-essentials@7.0.3(typescript@5.0.2): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + resolution: + { + integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==, + } peerDependencies: typescript: '>=3.7.0' dependencies: @@ -7320,7 +10104,10 @@ packages: dev: true /ts-node@10.9.1(@types/node@18.15.10)(typescript@5.0.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + resolution: + { + integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, + } hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -7351,7 +10138,10 @@ packages: dev: true /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + resolution: + { + integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==, + } dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -7360,25 +10150,40 @@ packages: dev: true /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } dev: true /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + resolution: + { + integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, + } dev: true /tslog@4.8.2: - resolution: {integrity: sha512-eAKIRjxfSKYLs06r1wT7oou6Uv9VN6NW9g0JPidBlqQwPBBl5+84dm7r8zSOPVq1kyfEw1P6B3/FLSpZCorAgA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-eAKIRjxfSKYLs06r1wT7oou6Uv9VN6NW9g0JPidBlqQwPBBl5+84dm7r8zSOPVq1kyfEw1P6B3/FLSpZCorAgA==, + } + engines: { node: '>=16' } dev: true /tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + resolution: + { + integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==, + } dev: true /tsutils@3.21.0(typescript@5.0.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: '>= 6' } peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: @@ -7387,82 +10192,127 @@ packages: dev: true /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } dependencies: safe-buffer: 5.2.1 dev: true /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + resolution: + { + integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==, + } dev: true /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + resolution: + { + integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==, + } dev: true /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + resolution: + { + integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, + } dev: true /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: '>= 0.8.0' } dependencies: prelude-ls: 1.1.2 dev: true /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } dependencies: prelude-ls: 1.2.1 dev: true /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } dev: true /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, + } + engines: { node: '>=10' } dev: true /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: '>=10' } dev: true /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } dev: true /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: '>=8' } dev: true /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==, + } + engines: { node: '>=8' } dev: true /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: '>=8' } dev: true /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: '>= 0.6' } dependencies: media-typer: 0.3.0 mime-types: 2.1.35 dev: true /typechain@8.1.1(typescript@5.0.2): - resolution: {integrity: sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==} + resolution: + { + integrity: sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==, + } hasBin: true peerDependencies: typescript: '>=4.3.0' @@ -7485,7 +10335,10 @@ packages: dev: true /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + resolution: + { + integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, + } dependencies: call-bind: 1.0.2 for-each: 0.3.3 @@ -7493,35 +10346,53 @@ packages: dev: true /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } dev: true /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, + } + engines: { node: '>=12.20' } hasBin: true dev: true /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==, + } + engines: { node: '>=8' } dev: true /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==, + } + engines: { node: '>=8' } dev: true /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + } + engines: { node: '>=0.8.0' } hasBin: true requiresBuild: true dev: true optional: true /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 @@ -7530,86 +10401,134 @@ packages: dev: true /undici@5.21.2: - resolution: {integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==} - engines: {node: '>=12.18'} + resolution: + { + integrity: sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==, + } + engines: { node: '>=12.18' } dependencies: busboy: 1.6.0 dev: true /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } dev: true /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, + } + engines: { node: '>= 10.0.0' } dev: true /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } dev: true /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } dependencies: punycode: 2.3.0 dev: true /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + resolution: + { + integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==, + } dev: true /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } dev: true /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: '>= 0.4.0' } dev: true /uuid@2.0.1: - resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} + resolution: + { + integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==, + } deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. dev: true /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + resolution: + { + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, + } deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true /uuid@7.0.3: - resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + resolution: + { + integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==, + } hasBin: true dev: true /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } hasBin: true dev: true /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } dev: true /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } dev: true /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + resolution: + { + integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==, + } + engines: { '0': node >=0.6.0 } dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 @@ -7617,8 +10536,11 @@ packages: dev: true /web3-utils@1.9.0: - resolution: {integrity: sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==, + } + engines: { node: '>=8.0.0' } dependencies: bn.js: 5.2.1 ethereum-bloom-filters: 1.0.10 @@ -7630,7 +10552,10 @@ packages: dev: true /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -7640,12 +10565,18 @@ packages: dev: true /which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + resolution: + { + integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, + } dev: true /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, + } + engines: { node: '>= 0.4' } dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -7656,50 +10587,74 @@ packages: dev: true /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } hasBin: true dependencies: isexe: 2.0.0 dev: true /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } hasBin: true dependencies: isexe: 2.0.0 dev: true /wide-align@1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + resolution: + { + integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==, + } dependencies: string-width: 2.1.1 dev: true /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, + } + engines: { node: '>=0.10.0' } dev: true /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } dev: true /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==, + } + engines: { node: '>=8.0.0' } dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 dev: true /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + resolution: + { + integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, + } dev: true /wrap-ansi@5.1.0: - resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==, + } + engines: { node: '>=6' } dependencies: ansi-styles: 3.2.1 string-width: 3.1.0 @@ -7707,8 +10662,11 @@ packages: dev: true /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 @@ -7716,8 +10674,11 @@ packages: dev: true /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 @@ -7725,12 +10686,18 @@ packages: dev: true /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } dev: true /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} + resolution: + { + integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==, + } + engines: { node: '>=8.3.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -7742,8 +10709,11 @@ packages: dev: true /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} + resolution: + { + integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==, + } + engines: { node: '>=8.3.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -7755,62 +10725,98 @@ packages: dev: true /xmlhttprequest@1.8.0: - resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==, + } + engines: { node: '>=0.4.0' } dev: true /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: '>=0.4' } dev: true /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } dev: true /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } dev: true /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } dev: true /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } dev: true /yaml@2.2.1: - resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==, + } + engines: { node: '>= 14' } dev: true /yargs-parser@13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + resolution: + { + integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==, + } dependencies: camelcase: 5.3.1 decamelize: 1.2.0 dev: true /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, + } + engines: { node: '>=10' } dev: true /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: '>=10' } dev: true /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } dev: true /yargs-unparser@1.6.0: - resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==, + } + engines: { node: '>=6' } dependencies: flat: 4.1.1 lodash: 4.17.21 @@ -7818,8 +10824,11 @@ packages: dev: true /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, + } + engines: { node: '>=10' } dependencies: camelcase: 6.3.0 decamelize: 4.0.0 @@ -7828,7 +10837,10 @@ packages: dev: true /yargs@13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + resolution: + { + integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==, + } dependencies: cliui: 5.0.0 find-up: 3.0.0 @@ -7843,8 +10855,11 @@ packages: dev: true /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: '>=10' } dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -7856,8 +10871,11 @@ packages: dev: true /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, + } + engines: { node: '>=12' } dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -7869,17 +10887,26 @@ packages: dev: true /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } dev: true /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } dev: true /zksync-web3@0.14.3(ethers@5.7.2): - resolution: {integrity: sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==} + resolution: + { + integrity: sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==, + } peerDependencies: ethers: ^5.7.0 dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6f8880b81..f79187706 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ packages: - contracts - typechain - contracts-upgradeable + - contracts-modularized diff --git a/scripts/deployModularized.ts b/scripts/deployModularized.ts new file mode 100644 index 000000000..15e7dfe83 --- /dev/null +++ b/scripts/deployModularized.ts @@ -0,0 +1,125 @@ +import { ethers } from 'hardhat'; +import { + type DiamondMultiInit__factory, + type SoulHubModularized, + type TransparentUpgradeableProxy, + ERC5727UpgradeableDS__factory, + ERC5727GovernanceUpgradeableDS__factory, +} from '../typechain'; +import { FacetCutAction, getSelectors, remove } from '../test/utils'; + +interface FacetCuts { + facetAddress: string; + action: number; + functionSelectors: string[]; +} + +async function deployTransparentProxy( + impl: string, + admin: string, + data: string, +): Promise { + const transparentProxyContract = await ethers.getContractFactory('TransparentUpgradeableProxy'); + const transparentProxy = await transparentProxyContract.deploy(impl, admin, data); + await transparentProxy.deployed(); + console.log('TransparentUpgradeableProxy contract deployed to:', transparentProxy.address); + return transparentProxy; +} + +async function deploySoulHub(): Promise { + const soulHubContract = await ethers.getContractFactory('SoulHubModularized'); + const soulHub = await soulHubContract.deploy(); + await soulHub.deployed(); + console.log('SoulHub contract deployed to:', soulHub.address); + return soulHub; +} + +async function deployFacets(): Promise { + const FacetNames = [ + 'DiamondCutFacet', + 'DiamondLoupeFacet', + 'ERC5727UpgradeableDS', + 'ERC5727ClaimableUpgradeableDS', + 'ERC5727GovernanceUpgradeableDS', + 'ERC5727RecoveryUpgradeableDS', + 'ERC5727ExpirableUpgradeableDS', + 'ERC5727EnumerableUpgradeableDS', + 'ERC5727DelegateUpgradeableDS', + ]; + // The `facetCuts` variable is the FacetCut[] that contains the functions to add during diamond deployment + const facetCuts: FacetCuts[] = []; + for (const FacetName of FacetNames) { + const Facet = await ethers.getContractFactory(FacetName); + const facet = await Facet.deploy(); + await facet.deployed(); + console.log(`${FacetName} deployed: ${facet.address}`); + if (facetCuts.length === 0) { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: getSelectors(facet), + }); + } else { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: remove( + getSelectors(facet), + facetCuts[facetCuts.length - 1].functionSelectors, + ), + }); + } + } + return facetCuts; +} +async function main(): Promise { + const [admin] = await ethers.getSigners(); + console.log('Deploying contracts with the account:', admin.address); + console.log('Network:', (await ethers.provider.getNetwork()).name); + const facetCuts = await deployFacets(); + const diamondMultiInitFactory: DiamondMultiInit__factory = await ethers.getContractFactory( + 'DiamondMultiInit', + ); + const diamondMultiInit = await diamondMultiInitFactory.deploy(); + console.log('diamondInit deployed: ', diamondMultiInit.address); + const IERC5727 = ERC5727UpgradeableDS__factory.createInterface(); + const IERC5727Governance = ERC5727GovernanceUpgradeableDS__factory.createInterface(); + const ERC5727InitCall = IERC5727.encodeFunctionData('init', [ + 'soulhub', + 'SOUL', + admin.address, + '1', + ]); + const ERC5727GovernanceInitCall = IERC5727Governance.encodeFunctionData('init', [admin.address]); + // Creating a function call + // This call gets executed during deployment and can also be executed in upgrades + // It is executed with delegatecall on the DiamondInit address. + const abi = [ + 'function multiInit(address[] calldata _addresses, bytes[] calldata _calldata) external', + ]; + const diamondMultiInitInterface = new ethers.utils.Interface(abi); + const functionCall = diamondMultiInitInterface.encodeFunctionData('multiInit', [ + [facetCuts[2].facetAddress, facetCuts[4].facetAddress], + [ERC5727InitCall, ERC5727GovernanceInitCall], + ]); + // Setting arguments that will be used in the diamond constructor + const diamondArgs = { + owner: admin.address, + init: diamondMultiInit.address, + initCalldata: functionCall, + }; + const Diamond = await ethers.getContractFactory('Diamond'); + const diamond = await Diamond.deploy(facetCuts, diamondArgs); + await diamond.deployed(); + const soulHubImpl = await deploySoulHub(); + const soulHubProxy = await deployTransparentProxy(soulHubImpl.address, admin.address, '0x'); + console.log('SoulHubProxy deployed: ', soulHubProxy.address); + console.log('Diamond deployed: ', diamond.address); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/ERC5727Example.test.ts b/test/ERC5727Example.test.ts index d59f93868..6d43dfb01 100644 --- a/test/ERC5727Example.test.ts +++ b/test/ERC5727Example.test.ts @@ -312,8 +312,10 @@ describe('ERC5727Test', function () { await expect(coreContract['revoke(uint256,uint256,bytes)'](100, 0, [])).be.reverted; }); - it('should decrease account balance if token is revoked', async function () { - const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployTokenFixture); + it('should set revoked if token is revoked', async function () { + const { getCoreContract, admin, tokenOwner1, ERC5727ExampleContract } = await loadFixture( + deployTokenFixture, + ); const coreContract = getCoreContract(admin); await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( tokenOwner1.address, @@ -323,9 +325,8 @@ describe('ERC5727Test', function () { admin.address, [], ); - expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(1); await coreContract['revoke(uint256,bytes)'](10, []); - expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(0); + expect(await ERC5727ExampleContract.isRevoked(10)).equal(true); }); it('should decrease token balance if amount is revoked', async function () { diff --git a/test/modularContract.test.ts b/test/modularContract.test.ts new file mode 100644 index 000000000..96d2588b0 --- /dev/null +++ b/test/modularContract.test.ts @@ -0,0 +1,1170 @@ +import { expect } from 'chai'; +import { ethers } from 'hardhat'; +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; +import { type SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { anyValue } from '@nomicfoundation/hardhat-chai-matchers/withArgs'; +import { + type DiamondMultiInit__factory, + type Diamond, + type ERC5727UpgradeableDS, + type ERC5727ClaimableUpgradeableDS, + type ERC5727GovernanceUpgradeableDS, + type ERC5727DelegateUpgradeableDS, + type ERC5727EnumerableUpgradeableDS, + type ERC5727RecoveryUpgradeableDS, + ERC5727UpgradeableDS__factory, + ERC5727ClaimableUpgradeableDS__factory, + ERC5727GovernanceUpgradeableDS__factory, + ERC5727RecoveryUpgradeableDS__factory, + ERC5727EnumerableUpgradeableDS__factory, + ERC5727DelegateUpgradeableDS__factory, +} from '../typechain'; +import { FacetCutAction, getSelectors, remove } from './utils'; +import { MerkleTree } from 'merkletreejs'; +interface Fixture { + getCoreContract: (signer: SignerWithAddress) => ERC5727UpgradeableDS; + getClaimableContract: (signer: SignerWithAddress) => ERC5727ClaimableUpgradeableDS; + getGovernanceContract: (signer: SignerWithAddress) => ERC5727GovernanceUpgradeableDS; + getRecoveryContract: (signer: SignerWithAddress) => ERC5727RecoveryUpgradeableDS; + getEnumerableContract: (signer: SignerWithAddress) => ERC5727EnumerableUpgradeableDS; + getDelegateContract: (signer: SignerWithAddress) => ERC5727DelegateUpgradeableDS; + diamond: Diamond; + admin: SignerWithAddress; + tokenOwner1: SignerWithAddress; + tokenOwner2: SignerWithAddress; + voter1: SignerWithAddress; + voter2: SignerWithAddress; + operator1: SignerWithAddress; + operator2: SignerWithAddress; +} + +interface FacetCuts { + facetAddress: string; + action: number; + functionSelectors: string[]; +} + +interface ClaimData { + to: string; + tokenId: number; + amount: number; + slot: number; + burnAuth: number; + verifier: string; + data: string | []; +} +interface MerkleTreeStore { + root: string; + proofs: Record; +} + +describe('ERC5727Modularized', function () { + async function deployDiamondFixture(): Promise { + const [admin, tokenOwner1, tokenOwner2, voter1, voter2, operator1, operator2] = + await ethers.getSigners(); + const diamondMultiInitFactory: DiamondMultiInit__factory = await ethers.getContractFactory( + 'DiamondMultiInit', + ); + const diamondMultiInit = await diamondMultiInitFactory.deploy(); + console.log('diamondInit deployed: ', diamondMultiInit.address); + const FacetNames = [ + 'DiamondCutFacet', + 'DiamondLoupeFacet', + 'ERC5727UpgradeableDS', + 'ERC5727ClaimableUpgradeableDS', + 'ERC5727GovernanceUpgradeableDS', + 'ERC5727RecoveryUpgradeableDS', + 'ERC5727ExpirableUpgradeableDS', + 'ERC5727EnumerableUpgradeableDS', + 'ERC5727DelegateUpgradeableDS', + ]; + // The `facetCuts` variable is the FacetCut[] that contains the functions to add during diamond deployment + const facetCuts: FacetCuts[] = []; + for (const FacetName of FacetNames) { + const Facet = await ethers.getContractFactory(FacetName); + const facet = await Facet.deploy(); + await facet.deployed(); + console.log(`${FacetName} deployed: ${facet.address}`); + if (facetCuts.length === 0) { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: getSelectors(facet), + }); + } else { + facetCuts.push({ + facetAddress: facet.address, + action: FacetCutAction.Add, + functionSelectors: remove( + getSelectors(facet), + facetCuts[facetCuts.length - 1].functionSelectors, + ), + }); + } + } + const IERC5727 = ERC5727UpgradeableDS__factory.createInterface(); + const IERC5727Governance = ERC5727GovernanceUpgradeableDS__factory.createInterface(); + const ERC5727InitCall = IERC5727.encodeFunctionData('init', [ + 'soulhub', + 'SOUL', + 'https://api.soularis.io/contracts/', + '1', + ]); + const ERC5727GovernanceInitCall = IERC5727Governance.encodeFunctionData('init', [ + admin.address, + ]); + + // Creating a function call + // This call gets executed during deployment and can also be executed in upgrades + // It is executed with delegatecall on the DiamondInit address. + const abi = [ + 'function multiInit(address[] calldata _addresses, bytes[] calldata _calldata) external', + ]; + const diamondMultiInitInterface = new ethers.utils.Interface(abi); + const functionCall = diamondMultiInitInterface.encodeFunctionData('multiInit', [ + [facetCuts[2].facetAddress, facetCuts[4].facetAddress], + [ERC5727InitCall, ERC5727GovernanceInitCall], + ]); + // Setting arguments that will be used in the diamond constructor + const diamondArgs = { + owner: admin.address, + init: diamondMultiInit.address, + initCalldata: functionCall, + }; + // deploy Diamond + const Diamond = await ethers.getContractFactory('Diamond'); + console.log(Diamond); + const diamond = await Diamond.deploy(facetCuts, diamondArgs); + await diamond.deployed(); + console.log('Diamond deployed: ', diamond.address); + const getCoreContract = (signer: SignerWithAddress): ERC5727UpgradeableDS => + ERC5727UpgradeableDS__factory.connect(diamond.address, signer); + const getClaimableContract = (signer: SignerWithAddress): ERC5727ClaimableUpgradeableDS => + ERC5727ClaimableUpgradeableDS__factory.connect(diamond.address, signer); + const getGovernanceContract = (signer: SignerWithAddress): ERC5727GovernanceUpgradeableDS => + ERC5727GovernanceUpgradeableDS__factory.connect(diamond.address, signer); + const getRecoveryContract = (signer: SignerWithAddress): ERC5727RecoveryUpgradeableDS => + ERC5727RecoveryUpgradeableDS__factory.connect(diamond.address, signer); + const getEnumerableContract = (signer: SignerWithAddress): ERC5727EnumerableUpgradeableDS => + ERC5727EnumerableUpgradeableDS__factory.connect(diamond.address, signer); + const getDelegateContract = (signer: SignerWithAddress): ERC5727DelegateUpgradeableDS => + ERC5727DelegateUpgradeableDS__factory.connect(diamond.address, signer); + return { + getCoreContract, + getClaimableContract, + getGovernanceContract, + getRecoveryContract, + getEnumerableContract, + getDelegateContract, + diamond, + admin, + tokenOwner1, + tokenOwner2, + voter1, + voter2, + operator1, + operator2, + }; + } + describe('Core', function () { + it('Should set right owner', async function () { + const { getCoreContract, admin } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + expect(await coreContract.owner()).to.equal(admin.address); + }); + it('only admin can issue', async function () { + const { getCoreContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(1); + expect(await coreContract.ownerOf(1)).equal(tokenOwner1.address); + const coreContractOther = getCoreContract(tokenOwner2); + await expect( + coreContractOther['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ), + ).be.reverted; + }); + it('only issuer can issue', async function () { + const { getCoreContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + expect(await coreContract.issuerOf(1)).equal(admin.address); + await coreContract['issue(uint256,uint256,bytes)'](1, 100, []); + const coreContractOther = getCoreContract(tokenOwner2); + await expect(coreContractOther['issue(uint256,uint256,bytes)'](1, 100, [])).be.reverted; + }); + + it('should increase account balance after issue', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(0); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + expect(await coreContract.issuerOf(1)).equal(admin.address); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(1); + }); + + it('should increase token balance after issue', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + expect(await coreContract.issuerOf(1)).equal(admin.address); + expect(await coreContract['balanceOf(uint256)'](1)).equal(0); + await coreContract['issue(uint256,uint256,bytes)'](1, 100, []); + expect(await coreContract['balanceOf(uint256)'](1)).equal(100); + }); + + it('should revert on transfer', async function () { + const { getCoreContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const coreContract = getCoreContract(admin); + const coreContractOwner1 = getCoreContract(tokenOwner1); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + await coreContract['issue(uint256,uint256,bytes)'](1, 100, []); + expect(await coreContract.ownerOf(1)).equal(tokenOwner1.address); + expect(await coreContract['balanceOf(uint256)'](1)).equal(100); + await expect( + coreContractOwner1['transferFrom(address,address,uint256)']( + tokenOwner1.address, + tokenOwner2.address, + 1, + ), + ).be.revertedWithCustomError(coreContract, 'Soulbound'); + + expect(await coreContract.ownerOf(1)).equal(tokenOwner1.address); + }); + + it('should revert on transfer value', async function () { + const { getCoreContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const coreContract = getCoreContract(admin); + const coreContractOwner1 = getCoreContract(tokenOwner1); + const coreContractOwner2 = getCoreContract(tokenOwner2); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + await coreContract['issue(uint256,uint256,bytes)'](1, 100, []); + expect(await coreContract.ownerOf(1)).equal(tokenOwner1.address); + expect(await coreContract['balanceOf(uint256)'](1)).equal(100); + await coreContractOwner1['approve(uint256,address,uint256)'](1, tokenOwner2.address, 100); + await expect( + coreContractOwner2['transferFrom(uint256,address,uint256)'](1, tokenOwner2.address, 50), + ).revertedWithCustomError(coreContract, 'Soulbound'); + await expect( + coreContractOwner1['transferFrom(uint256,address,uint256)'](1, tokenOwner2.address, 50), + ).revertedWithCustomError(coreContract, 'Soulbound'); + expect(await coreContract['balanceOf(uint256)'](1)).equal(100); + expect(await coreContract.ownerOf(1)).equal(tokenOwner1.address); + }); + + it('should revert on approve if unauthorized', async function () { + const { getCoreContract, admin, tokenOwner1, tokenOwner2, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const coreContract = getCoreContract(admin); + const coreContractOwner1 = getCoreContract(tokenOwner1); + const coreContractOwner2 = getCoreContract(tokenOwner2); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 1, + admin.address, + [], + ); + await coreContract['issue(uint256,uint256,bytes)'](1, 100, []); + await expect( + coreContractOwner2['approve(uint256,address,uint256)'](1, operator1.address, 100), + ).reverted; + await coreContractOwner1['approve(uint256,address,uint256)'](1, operator1.address, 100); + }); + + it('should set burnAuth correctly', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 2, + 1, + 1, + admin.address, + [], + ); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 3, + 1, + 2, + admin.address, + [], + ); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 4, + 1, + 3, + admin.address, + [], + ); + expect(await coreContract.burnAuth(1)).equal(0); + expect(await coreContract.burnAuth(2)).equal(1); + expect(await coreContract.burnAuth(3)).equal(2); + expect(await coreContract.burnAuth(4)).equal(3); + }); + + it('only burner can revoke', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + expect(await coreContract.owner()).equal(admin.address); + expect(await coreContract.hasBurnRole(tokenOwner1.address, 1)).equal(false); + const coreContractOwner1 = getCoreContract(tokenOwner1); + await expect(coreContractOwner1['revoke(uint256,bytes)'](10, [])).be.reverted; + await coreContract['revoke(uint256,bytes)'](10, []); + }); + + it('should revert on revoke if token does not exist', async function () { + const { getCoreContract, admin } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await expect(coreContract['revoke(uint256,bytes)'](100, [])).be.reverted; + await expect(coreContract['revoke(uint256,uint256,bytes)'](100, 0, [])).be.reverted; + }); + + it('should set rekoved if token is revoked', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 11, + 1, + 0, + admin.address, + [], + ); + await coreContract['revoke(uint256,bytes)'](10, []); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(2); + expect(await coreContract.isRevoked(10)).equal(true); + expect(await coreContract.isRevoked(11)).equal(false); + }); + + it('should decrease token balance if amount is revoked', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + await coreContract['issue(uint256,uint256,bytes)'](10, 100, []); + expect(await coreContract['balanceOf(uint256)'](10)).equal(100); + await coreContract['revoke(uint256,uint256,bytes)'](10, 50, []); + expect(await coreContract['balanceOf(uint256)'](10)).equal(50); + }); + + it('only burner can revoke amount', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + await coreContract['issue(uint256,uint256,bytes)'](10, 100, []); + const coreContractOwner1 = getCoreContract(tokenOwner1); + expect(await coreContract['balanceOf(uint256)'](10)).equal(100); + await expect(coreContractOwner1['revoke(uint256,uint256,bytes)'](10, 50, [])).be.reverted; + await coreContract['revoke(uint256,uint256,bytes)'](10, 50, []); + expect(await coreContract['balanceOf(uint256)'](10)).equal(50); + }); + it('query verifier of token', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + expect(await coreContract.verifierOf(10)).equal(admin.address); + }); + it('should revert on query verifier of token if token id is invaild', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + await expect(coreContract.verifierOf(1)).be.reverted; + }); + it('query if token is locked', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + expect(await coreContract.locked(10)).equal(true); + }); + it('should revert on query if token is locked if token id is invaild', async function () { + const { getCoreContract, admin, tokenOwner1 } = await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 10, + 1, + 0, + admin.address, + [], + ); + expect(await coreContract.locked(10)).equal(true); + await expect(coreContract.locked(1)).be.reverted; + }); + }); + describe('Claimable', function () { + function createMerkleTree(data: ClaimData[]): MerkleTreeStore { + const leafNodes = data.map((d) => + ethers.utils.solidityKeccak256( + ['address', 'uint256', 'uint256', 'uint256', 'uint8', 'address', 'bytes'], + Object.values(d), + ), + ); + const merkletree = new MerkleTree(leafNodes, ethers.utils.keccak256, { sortPairs: true }); + const root: string = merkletree.getHexRoot(); + const proofs: Record = {}; + for (let i = 0; i < data.length; i++) { + proofs[data[i].to] = merkletree.getHexProof(leafNodes[i]); + } + return { + root, + proofs, + }; + } + + it('only admin can set claim events', async function () { + const { getClaimableContract, admin, tokenOwner1, tokenOwner2, operator1 } = + await loadFixture(deployDiamondFixture); + const claimableContract = getClaimableContract(admin); + const { root } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.connect(admin).setClaimEvent(admin.address, 1, root); + await expect(claimableContract.connect(operator1).setClaimEvent(operator1.address, 1, root)) + .be.reverted; + }); + + it('should revert if claim event is already set for a slot', async function () { + const { getClaimableContract, admin, tokenOwner1, tokenOwner2, operator1 } = + await loadFixture(deployDiamondFixture); + const claimableContract = getClaimableContract(admin); + const { root } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.connect(admin).setClaimEvent(ethers.constants.AddressZero, 1, root); + await expect(claimableContract.connect(admin).setClaimEvent(operator1.address, 1, root)).be + .reverted; + }); + + it('should claim if account is eligible', async function () { + const { getClaimableContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const claimableContract = getClaimableContract(admin); + const { root, proofs } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.connect(admin).setClaimEvent(admin.address, 1, root); + await claimableContract + .connect(tokenOwner1) + .claim(tokenOwner1.address, 1, 1, 1, 0, admin.address, [], proofs[tokenOwner1.address]); + await claimableContract + .connect(tokenOwner2) + .claim(tokenOwner2.address, 2, 1, 1, 0, admin.address, [], proofs[tokenOwner2.address]); + }); + + it('should increase balances after claim', async function () { + const { getClaimableContract, getCoreContract, admin, tokenOwner1, tokenOwner2 } = + await loadFixture(deployDiamondFixture); + const claimableContract = getClaimableContract(admin); + const coreContract = getCoreContract(admin); + const { root, proofs } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.connect(admin).setClaimEvent(admin.address, 1, root); + await claimableContract + .connect(tokenOwner1) + .claim(tokenOwner1.address, 1, 1, 1, 0, admin.address, [], proofs[tokenOwner1.address]); + await claimableContract + .connect(tokenOwner2) + .claim(tokenOwner2.address, 2, 1, 1, 0, admin.address, [], proofs[tokenOwner2.address]); + expect(await coreContract['balanceOf(uint256)'](1)).equal(1); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(1); + expect(await coreContract['balanceOf(uint256)'](2)).equal(1); + expect(await coreContract['balanceOf(address)'](tokenOwner2.address)).equal(1); + }); + + it('revert if claimer already claimed', async function () { + const { getClaimableContract, getCoreContract, admin, tokenOwner1, tokenOwner2 } = + await loadFixture(deployDiamondFixture); + const claimableContract = getClaimableContract(admin); + const coreContract = getCoreContract(admin); + const claimableContractOwner1 = getClaimableContract(tokenOwner1); + const { root, proofs } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.setClaimEvent(admin.address, 1, root); + await claimableContract + .connect(tokenOwner1) + .claim(tokenOwner1.address, 1, 1, 1, 0, admin.address, [], proofs[tokenOwner1.address]); + expect(await coreContract['balanceOf(uint256)'](1)).equal(1); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).equal(1); + await expect( + claimableContractOwner1.claim( + tokenOwner1.address, + 1, + 1, + 1, + 0, + admin.address, + [], + proofs[tokenOwner1.address], + ), + ).be.reverted; + }); + it('query if a slot is claimed', async function () { + const { getClaimableContract, admin, tokenOwner1, tokenOwner2 } = await loadFixture( + deployDiamondFixture, + ); + const claimableContract = getClaimableContract(admin); + const { root, proofs } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.setClaimEvent(admin.address, 1, root); + expect(await claimableContract.isClaimed(tokenOwner1.address, 1)).equal(false); + await claimableContract + .connect(tokenOwner1) + .claim(tokenOwner1.address, 1, 1, 1, 0, admin.address, [], proofs[tokenOwner1.address]); + expect(await claimableContract.isClaimed(tokenOwner1.address, 1)).equal(true); + }); + it('revert if claimer is not eligible', async function () { + const { getClaimableContract, admin, tokenOwner1, tokenOwner2, operator1 } = + await loadFixture(deployDiamondFixture); + const claimableContract = getClaimableContract(admin); + const claimableContractOperator1 = getClaimableContract(operator1); + const { root, proofs } = createMerkleTree([ + { + to: tokenOwner1.address, + tokenId: 1, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + { + to: tokenOwner2.address, + tokenId: 2, + amount: 1, + slot: 1, + burnAuth: 0, + verifier: admin.address, + data: [], + }, + ]); + await claimableContract.setClaimEvent(admin.address, 1, root); + await expect( + claimableContractOperator1.claim( + tokenOwner1.address, + 1, + 1, + 1, + 0, + admin.address, + [], + proofs[tokenOwner1.address], + ), + ).be.reverted; + }); + }); + describe('ERC5727Governance', function () { + it('admin should has voter role', async function () { + const { getGovernanceContract, admin } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + expect(await governanceContract.isVoter(admin.address)).equal(true); + }); + it('only admin can add voter', async function () { + const { getGovernanceContract, admin, voter1, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractOperator = getGovernanceContract(operator1); + await expect(governanceContractOperator.addVoter(voter1.address)).be.reverted; + await governanceContract.addVoter(voter1.address); + }); + it('only admin can remove voter', async function () { + const { getGovernanceContract, admin, voter1, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractOperator = getGovernanceContract(operator1); + await governanceContract.addVoter(voter1.address); + await expect(governanceContractOperator.removeVoter(voter1.address)).be.reverted; + await governanceContract.removeVoter(voter1.address); + }); + it('add voter should set voter role correctly', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + expect(await governanceContract.isVoter(voter1.address)).equal(true); + }); + it('remove voter should remove voter role correctly', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + await governanceContract.removeVoter(voter1.address); + expect(await governanceContract.isVoter(voter1.address)).equal(false); + }); + it('query voter count should return correct count', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + expect(await governanceContract.voterCount()).equal(1); + await governanceContract.addVoter(voter1.address); + expect(await governanceContract.voterCount()).equal(2); + }); + it('query voter by index should return correct voter', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + expect(await governanceContract.voterByIndex(0)).equal(admin.address); + await governanceContract.addVoter(voter1.address); + expect(await governanceContract.voterByIndex(1)).equal(voter1.address); + }); + it('should revert query voter by index if index out of bounds', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + expect(await governanceContract.voterByIndex(0)).equal(admin.address); + await governanceContract.addVoter(voter1.address); + expect(await governanceContract.voterByIndex(1)).equal(voter1.address); + await expect(governanceContract.voterByIndex(2)).be.reverted; + }); + it('should revert on add voter if voter is already a voter', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + expect(await governanceContract.voterByIndex(0)).equal(admin.address); + await governanceContract.addVoter(voter1.address); + await expect(governanceContract.addVoter(voter1.address)).be.reverted; + }); + it('query approval uri should return correct uri', async function () { + const { getGovernanceContract, admin, tokenOwner1, getCoreContract } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const coreContract = getCoreContract(admin); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + const contractAddress: string = coreContract.address.toLowerCase(); + expect(await governanceContract.approvalURI(0)).equal( + `https://api.soularis.io/contracts/${contractAddress}/approvals/0`, + ); + }); + it('should revert on query approval uri if approval does not exist', async function () { + const { getGovernanceContract, admin } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await expect(governanceContract.approvalURI(0)).be.reverted; + }); + it('only voter can issue approval', async function () { + const { getGovernanceContract, admin, tokenOwner1, voter1, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter = getGovernanceContract(voter1); + const governanceContractOperator = getGovernanceContract(operator1); + await governanceContract.addVoter(voter1.address); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContractVoter.requestApproval( + tokenOwner1.address, + 1, + 1, + 1, + 0, + admin.address, + [], + ); + await expect( + governanceContractOperator.requestApproval( + tokenOwner1.address, + 1, + 1, + 1, + 0, + admin.address, + [], + ), + ).be.reverted; + }); + it('should revert on issue approval if recipient is invaild', async function () { + const { getGovernanceContract, admin, voter1 } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + await expect( + governanceContract.requestApproval( + ethers.constants.AddressZero, + 1, + 1, + 1, + 0, + admin.address, + [], + ), + ).be.reverted; + }); + it('should revert on issue approval if slot or token id is invaild', async function () { + const { getGovernanceContract, tokenOwner1, admin, voter1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + await expect( + governanceContract.requestApproval(tokenOwner1.address, 0, 1, 1, 0, admin.address, []), + ).be.reverted; + await expect( + governanceContract.requestApproval(tokenOwner1.address, 1, 1, 0, 0, admin.address, []), + ).be.reverted; + await expect( + governanceContract.requestApproval(tokenOwner1.address, 0, 1, 0, 0, admin.address, []), + ).be.reverted; + }); + it('should revert on remove approval if approval is not pending', async function () { + const { getGovernanceContract, tokenOwner1, admin, voter1, voter2 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter1 = getGovernanceContract(voter1); + await governanceContract.addVoter(voter1.address); + await governanceContract.addVoter(voter2.address); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.voteApproval(0, true, []); + await governanceContractVoter1.voteApproval(0, true, []); + await expect(governanceContract.removeApprovalRequest(0)).be.reverted; + }); + it('issue approval should emit event correctly', async function () { + const { getGovernanceContract, tokenOwner1, admin, voter1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + await expect( + governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []), + ) + .to.emit(governanceContract, 'ApprovalUpdate') + .withArgs(anyValue, admin.address, 0); + }); + it('query approval should return correct approval', async function () { + const { getGovernanceContract, tokenOwner1, admin, voter1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + await governanceContract.addVoter(voter1.address); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.getApproval(0); + }); + it('should revert on query approval if approval does not exist', async function () { + const { getGovernanceContract, admin } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await expect(governanceContract.getApproval(0)).be.reverted; + }); + it('only voter can vote for approval', async function () { + const { getGovernanceContract, admin, tokenOwner1, voter1, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter = getGovernanceContract(voter1); + const governanceContractOperator = getGovernanceContract(operator1); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.addVoter(voter1.address); + await governanceContractVoter.voteApproval(0, true, []); + await governanceContract.voteApproval(0, true, []); + await expect(governanceContractOperator.voteApproval(0, true, [])).be.reverted; + }); + it('only creator can remove approval', async function () { + const { getGovernanceContract, admin, tokenOwner1, voter1, operator1 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter = getGovernanceContract(voter1); + const governanceContractOperator = getGovernanceContract(operator1); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.addVoter(voter1.address); + await expect(governanceContractVoter.removeApprovalRequest(0)).be.reverted; + await expect(governanceContractOperator.removeApprovalRequest(0)).be.reverted; + await governanceContract.removeApprovalRequest(0); + }); + it('should revert on remove approval if approval id is invaild', async function () { + const { getGovernanceContract, admin } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await expect(governanceContract.removeApprovalRequest(0)).be.reverted; + }); + it('remove approval should emit event correctly', async function () { + const { getGovernanceContract, tokenOwner1, admin } = await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await expect(governanceContract.removeApprovalRequest(0)) + .to.emit(governanceContract, 'ApprovalUpdate') + .withArgs(0, ethers.constants.AddressZero, 3); + }); + it('vote approval should issue token correctly if approval is approved', async function () { + const { getGovernanceContract, admin, tokenOwner1, getCoreContract, voter1, voter2 } = + await loadFixture(deployDiamondFixture); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter1 = getGovernanceContract(voter1); + const coreContract = getCoreContract(admin); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.addVoter(voter1.address); + await governanceContract.addVoter(voter2.address); + await governanceContractVoter1.voteApproval(0, true, []); + await expect(governanceContract.voteApproval(0, true, [])) + .to.emit(governanceContract, 'ApprovalUpdate') + .withArgs(0, admin.address, 1); + expect(await coreContract['balanceOf(address)'](tokenOwner1.address)).to.equal(1); + expect(await coreContract['balanceOf(uint256)'](1)).to.equal(1); + }); + it('vote approval should reject approval if approval is rejected', async function () { + const { getGovernanceContract, admin, tokenOwner1, voter1, voter2 } = await loadFixture( + deployDiamondFixture, + ); + const governanceContract = getGovernanceContract(admin); + const governanceContractVoter1 = getGovernanceContract(voter1); + await governanceContract.requestApproval(tokenOwner1.address, 1, 1, 1, 0, admin.address, []); + await governanceContract.addVoter(voter1.address); + await governanceContract.addVoter(voter2.address); + await governanceContractVoter1.voteApproval(0, false, []); + await expect(governanceContract.voteApproval(0, false, [])) + .to.emit(governanceContract, 'ApprovalUpdate') + .withArgs(0, admin.address, 2); + }); + }); + describe('ERC5727Delegate', function () { + it('only admin can delegate', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, tokenOwner2, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const delegateContract = getDelegateContract(admin); + const delegateContractOwner2 = getDelegateContract(tokenOwner2); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await expect(delegateContractOwner2.delegate(operator1.address, 1)).be.reverted; + await delegateContract.delegate(operator1.address, 1); + }); + + it('should grant operator the permission to issue tokens in a slot', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const coreContractOperator1 = getCoreContract(operator1); + const delegateContract = getDelegateContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await delegateContract.delegate(operator1.address, 1); + expect(await delegateContract.isOperatorFor(operator1.address, 1)).equal(true); + expect(await delegateContract.isOperatorFor(operator1.address, 2)).equal(false); + expect(await coreContract.hasMintRole(operator1.address, 1)).equal(true); + await coreContractOperator1['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 2, + 1, + 0, + admin.address, + [], + ); + expect(await coreContract.ownerOf(2)).equal(tokenOwner1.address); + }); + + it('should revert if operator is already delegated', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const delegateContract = getDelegateContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await delegateContract.delegate(operator1.address, 1); + await expect(delegateContract.delegate(operator1.address, 1)).be.reverted; + }); + + it('should revert on delegate if slot is invalid', async function () { + const { getDelegateContract, admin, operator1 } = await loadFixture(deployDiamondFixture); + const delegateContract = getDelegateContract(admin); + await expect(delegateContract.delegate(operator1.address, 0)).be.reverted; + }); + + it('should revert on delegate if operator is invalid', async function () { + const { getDelegateContract, admin } = await loadFixture(deployDiamondFixture); + const delegateContract = getDelegateContract(admin); + await expect(delegateContract.delegate(ethers.constants.AddressZero, 1)).be.reverted; + }); + + it('only admin can undelegate', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, tokenOwner2, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const delegateContract = getDelegateContract(admin); + const delegateContractOwner2 = getDelegateContract(tokenOwner2); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await delegateContract.delegate(operator1.address, 1); + await expect(delegateContractOwner2.undelegate(operator1.address, 1)).be.reverted; + await delegateContract.undelegate(operator1.address, 1); + }); + + it('should revert on undelegate if slot is invalid', async function () { + const { getDelegateContract, admin, operator1 } = await loadFixture(deployDiamondFixture); + const delegateContract = getDelegateContract(admin); + await expect(delegateContract.undelegate(operator1.address, 0)).be.reverted; + }); + + it('should revert on undelegate if operator is invalid', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const delegateContract = getDelegateContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await delegateContract.delegate(operator1.address, 1); + await expect(delegateContract.undelegate(ethers.constants.AddressZero, 1)).be.reverted; + }); + + it('should revert on undelegate if operator is not delegated', async function () { + const { getCoreContract, getDelegateContract, admin, tokenOwner1, operator1 } = + await loadFixture(deployDiamondFixture); + const coreContract = getCoreContract(admin); + const delegateContract = getDelegateContract(admin); + await coreContract['issue(address,uint256,uint256,uint8,address,bytes)']( + tokenOwner1.address, + 1, + 1, + 0, + admin.address, + [], + ); + await expect(delegateContract.undelegate(operator1.address, 1)).be.reverted; + }); + }); +}); diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 000000000..71653875e --- /dev/null +++ b/test/utils.ts @@ -0,0 +1,85 @@ +import { type Contract, ethers } from 'ethers'; + +const FacetCutAction = { Add: 0, Replace: 1, Remove: 2 }; + +// get function selectors from ABI +function getSelectors(contract: Contract): string[] { + const signatures = Object.keys(contract.interface.functions); + const selectors = signatures.reduce((acc: any, val: any) => { + if (val !== 'init(bytes)') { + acc.push(contract.interface.getSighash(val)); + } + return acc; + }, []); + selectors.contract = contract; + selectors.remove = remove; + selectors.get = get; + return selectors; +} + +// get function selector from function signature +function getSelector(func: any): string { + const abiInterface = new ethers.utils.Interface([func]); + return abiInterface.getSighash(ethers.utils.Fragment.from(func)); +} + +// used with getSelectors to remove selectors from an array of selectors +// functionNames argument is an array of function signatures +function remove(_this: any, existSelectors: any): string[] { + const selectors = _this.filter((v: string) => { + for (const existSelector of existSelectors) { + if (v === existSelector) { + return false; + } + } + return true; + }); + selectors.contract = _this.contract; + selectors.remove = _this.remove; + selectors.get = _this.get; + return selectors; +} + +// used with getSelectors to get selectors from an array of selectors +// functionNames argument is an array of function signatures +function get(this: any, functionNames: any): string[] { + const selectors = this.filter((v: string) => { + for (const functionName of functionNames) { + if (v === this.contract.interface.getSighash(functionName)) { + return true; + } + } + return false; + }); + selectors.contract = this.contract; + selectors.remove = this.remove; + selectors.get = this.get; + return selectors; +} + +// remove selectors using an array of signatures +function removeSelectors(selectors: any[], signatures: any[]): string[] { + const iface = new ethers.utils.Interface(signatures.map((v: string) => 'function ' + v)); + const removeSelectors = signatures.map((v) => iface.getSighash(v)); + selectors = selectors.filter((v) => !removeSelectors.includes(v)); + return selectors; +} + +// find a particular address position in the return value of diamondLoupeFacet.facets() +function findAddressPositionInFacets(facetAddress: any, facets: string | any[]): number { + for (let i = 0; i < facets.length; i++) { + if (facets[i].facetAddress === facetAddress) { + return i; + } + } + return 0; +} + +export { + FacetCutAction, + getSelectors, + getSelector, + remove, + removeSelectors, + findAddressPositionInFacets, +}; diff --git a/tsconfig.json b/tsconfig.json index 5e100e672..39128266a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,6 +25,6 @@ "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"] }, - "include": ["**/*.ts"], + "include": ["**/*.ts", "test/utils.js"], "exclude": ["node_modules", "typechain-types"] }