From 45189e80470e8b4cb7bcd8c40dfdfc94677a692c Mon Sep 17 00:00:00 2001 From: steven2308 Date: Sat, 2 Mar 2024 22:03:14 -0500 Subject: [PATCH 01/15] Improvement on RMRKTokenHolder implementation and IERC7401 docs. RMRKTokenHolder (IERC7590-Draft Implementation) now reverts if transferred ERC-20 balance is not the specified amount. Improves @dev comment on IERC7401, directOwnerOf method. --- .../extension/tokenHolder/RMRKTokenHolder.sol | 23 +++++++++++++++---- contracts/RMRK/nestable/IERC7401.sol | 3 +-- docs/RMRK/equippable/RMRKEquippable.md | 2 +- .../RMRK/equippable/RMRKMinifiedEquippable.md | 2 +- .../IRMRKNestableAutoIndex.md | 2 +- .../RMRKNestableAutoIndex.md | 2 +- .../reclaimableChild/RMRKReclaimableChild.md | 2 +- .../extension/tokenHolder/RMRKTokenHolder.md | 11 +++++++++ docs/RMRK/nestable/IERC7401.md | 2 +- docs/RMRK/nestable/RMRKNestable.md | 2 +- docs/RMRK/nestable/RMRKNestableMultiAsset.md | 2 +- .../abstract/RMRKAbstractEquippable.md | 2 +- .../abstract/RMRKAbstractNestable.md | 2 +- .../RMRKAbstractNestableMultiAsset.md | 2 +- .../RMRKEquippableLazyMintErc20.md | 2 +- .../RMRKEquippableLazyMintErc20Soulbound.md | 2 +- .../RMRKNestableLazyMintErc20.md | 2 +- .../RMRKNestableLazyMintErc20Soulbound.md | 2 +- .../RMRKNestableMultiAssetLazyMintErc20.md | 2 +- ...estableMultiAssetLazyMintErc20Soulbound.md | 2 +- .../RMRKEquippableLazyMintNative.md | 2 +- .../RMRKEquippableLazyMintNativeSoulbound.md | 2 +- .../RMRKNestableLazyMintNative.md | 2 +- .../RMRKNestableLazyMintNativeSoulbound.md | 2 +- .../RMRKNestableMultiAssetLazyMintNative.md | 2 +- ...stableMultiAssetLazyMintNativeSoulbound.md | 2 +- .../premint/RMRKEquippablePreMint.md | 2 +- .../premint/RMRKEquippablePreMintSoulbound.md | 2 +- .../premint/RMRKNestableMultiAssetPreMint.md | 2 +- .../RMRKNestableMultiAssetPreMintSoulbound.md | 2 +- .../premint/RMRKNestablePreMint.md | 2 +- .../premint/RMRKNestablePreMintSoulbound.md | 2 +- 32 files changed, 60 insertions(+), 35 deletions(-) diff --git a/contracts/RMRK/extension/tokenHolder/RMRKTokenHolder.sol b/contracts/RMRK/extension/tokenHolder/RMRKTokenHolder.sol index 2cebf56e..dc6f9d0c 100644 --- a/contracts/RMRK/extension/tokenHolder/RMRKTokenHolder.sol +++ b/contracts/RMRK/extension/tokenHolder/RMRKTokenHolder.sol @@ -5,9 +5,10 @@ pragma solidity ^0.8.21; import "./IERC7590.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -error InvalidValue(); -error InvalidAddress(); error InsufficientBalance(); +error InvalidAddress(); +error InvalidAmountTransferred(); +error InvalidValue(); abstract contract RMRKTokenHolder is IERC7590 { mapping(uint256 tokenId => mapping(address erc20Address => uint256 balance)) @@ -57,10 +58,17 @@ abstract contract RMRKTokenHolder is IERC7590 { amount, data ); + IERC20 erc20 = IERC20(erc20Contract); + uint256 initBalance = erc20.balanceOf(address(this)); _balances[tokenId][erc20Contract] -= amount; _erc20TransferOutNonce[tokenId]++; - IERC20(erc20Contract).transfer(to, amount); + erc20.transfer(to, amount); + uint256 newBalance = erc20.balanceOf(address(this)); + // Here you can either use the difference as the amount, or revert if the difference is not equal to the amount and you don't want to support transfer fees + if (newBalance + amount != initBalance) { + revert InvalidAmountTransferred(); + } emit TransferredERC20(erc20Contract, tokenId, to, amount); _afterTransferHeldERC20FromToken( @@ -94,7 +102,14 @@ abstract contract RMRKTokenHolder is IERC7590 { amount, data ); - IERC20(erc20Contract).transferFrom(msg.sender, address(this), amount); + IERC20 erc20 = IERC20(erc20Contract); + uint256 initBalance = erc20.balanceOf(address(this)); + erc20.transferFrom(msg.sender, address(this), amount); + uint256 newBalance = erc20.balanceOf(address(this)); + // Here you can either use the difference as the amount, or revert if the difference is not equal to the amount and you don't want to support transfer fees + if (initBalance + amount != newBalance) { + revert InvalidAmountTransferred(); + } _balances[tokenId][erc20Contract] += amount; emit ReceivedERC20(erc20Contract, tokenId, msg.sender, amount); diff --git a/contracts/RMRK/nestable/IERC7401.sol b/contracts/RMRK/nestable/IERC7401.sol index 1d54a10a..b7b65444 100644 --- a/contracts/RMRK/nestable/IERC7401.sol +++ b/contracts/RMRK/nestable/IERC7401.sol @@ -123,8 +123,7 @@ interface IERC7401 is IERC165 { /** * @notice Used to retrieve the immediate owner of the given token. - * @dev If the immediate owner is another token, the address returned, should be the one of the parent token's - * collection smart contract. + * @dev If the immediate owner is another token, the address returned will be the parent token's collection address. * @param tokenId ID of the token for which the RMRK owner is being retrieved * @return owner Address of the given token's owner * @return parentId The ID of the parent token. Should be `0` if the owner is an externally owned account diff --git a/docs/RMRK/equippable/RMRKEquippable.md b/docs/RMRK/equippable/RMRKEquippable.md index f0ec941f..ee99f799 100644 --- a/docs/RMRK/equippable/RMRKEquippable.md +++ b/docs/RMRK/equippable/RMRKEquippable.md @@ -272,7 +272,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/equippable/RMRKMinifiedEquippable.md b/docs/RMRK/equippable/RMRKMinifiedEquippable.md index 88e4a918..7d405ca1 100644 --- a/docs/RMRK/equippable/RMRKMinifiedEquippable.md +++ b/docs/RMRK/equippable/RMRKMinifiedEquippable.md @@ -272,7 +272,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/extension/nestableAutoIndex/IRMRKNestableAutoIndex.md b/docs/RMRK/extension/nestableAutoIndex/IRMRKNestableAutoIndex.md index 9f6942bd..691a06f7 100644 --- a/docs/RMRK/extension/nestableAutoIndex/IRMRKNestableAutoIndex.md +++ b/docs/RMRK/extension/nestableAutoIndex/IRMRKNestableAutoIndex.md @@ -141,7 +141,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner, ui Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/extension/nestableAutoIndex/RMRKNestableAutoIndex.md b/docs/RMRK/extension/nestableAutoIndex/RMRKNestableAutoIndex.md index 0046c61f..9be4d016 100644 --- a/docs/RMRK/extension/nestableAutoIndex/RMRKNestableAutoIndex.md +++ b/docs/RMRK/extension/nestableAutoIndex/RMRKNestableAutoIndex.md @@ -230,7 +230,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/extension/reclaimableChild/RMRKReclaimableChild.md b/docs/RMRK/extension/reclaimableChild/RMRKReclaimableChild.md index c6b71fde..fc04568e 100644 --- a/docs/RMRK/extension/reclaimableChild/RMRKReclaimableChild.md +++ b/docs/RMRK/extension/reclaimableChild/RMRKReclaimableChild.md @@ -212,7 +212,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/extension/tokenHolder/RMRKTokenHolder.md b/docs/RMRK/extension/tokenHolder/RMRKTokenHolder.md index e1954bfc..6ed6796c 100644 --- a/docs/RMRK/extension/tokenHolder/RMRKTokenHolder.md +++ b/docs/RMRK/extension/tokenHolder/RMRKTokenHolder.md @@ -173,6 +173,17 @@ error InvalidAddress() +### InvalidAmountTransferred + +```solidity +error InvalidAmountTransferred() +``` + + + + + + ### InvalidValue ```solidity diff --git a/docs/RMRK/nestable/IERC7401.md b/docs/RMRK/nestable/IERC7401.md index c030f7a7..03d21565 100644 --- a/docs/RMRK/nestable/IERC7401.md +++ b/docs/RMRK/nestable/IERC7401.md @@ -123,7 +123,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner, ui Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/nestable/RMRKNestable.md b/docs/RMRK/nestable/RMRKNestable.md index 0ac18830..7069bc2d 100644 --- a/docs/RMRK/nestable/RMRKNestable.md +++ b/docs/RMRK/nestable/RMRKNestable.md @@ -212,7 +212,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/RMRK/nestable/RMRKNestableMultiAsset.md b/docs/RMRK/nestable/RMRKNestableMultiAsset.md index 3a590173..0d03ff89 100644 --- a/docs/RMRK/nestable/RMRKNestableMultiAsset.md +++ b/docs/RMRK/nestable/RMRKNestableMultiAsset.md @@ -247,7 +247,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/abstract/RMRKAbstractEquippable.md b/docs/implementations/abstract/RMRKAbstractEquippable.md index ba6e9b8c..85bf14a4 100644 --- a/docs/implementations/abstract/RMRKAbstractEquippable.md +++ b/docs/implementations/abstract/RMRKAbstractEquippable.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/abstract/RMRKAbstractNestable.md b/docs/implementations/abstract/RMRKAbstractNestable.md index 8d3a9662..054c83dd 100644 --- a/docs/implementations/abstract/RMRKAbstractNestable.md +++ b/docs/implementations/abstract/RMRKAbstractNestable.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/abstract/RMRKAbstractNestableMultiAsset.md b/docs/implementations/abstract/RMRKAbstractNestableMultiAsset.md index 6d7cfb4d..b9fddf59 100644 --- a/docs/implementations/abstract/RMRKAbstractNestableMultiAsset.md +++ b/docs/implementations/abstract/RMRKAbstractNestableMultiAsset.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20.md b/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20.md index 13cde646..cd392e52 100644 --- a/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20.md +++ b/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20Soulbound.md b/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20Soulbound.md index 6f2fd5dd..b84fea6d 100644 --- a/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20Soulbound.md +++ b/docs/implementations/lazyMintErc20/RMRKEquippableLazyMintErc20Soulbound.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20.md b/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20.md index fdca9b9b..3b10d76e 100644 --- a/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20.md +++ b/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20Soulbound.md b/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20Soulbound.md index 2ec4a2cd..0419a5bc 100644 --- a/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20Soulbound.md +++ b/docs/implementations/lazyMintErc20/RMRKNestableLazyMintErc20Soulbound.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20.md b/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20.md index ab5c229b..4bbbc6f0 100644 --- a/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20.md +++ b/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20Soulbound.md b/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20Soulbound.md index 44b01807..6e9349a8 100644 --- a/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20Soulbound.md +++ b/docs/implementations/lazyMintErc20/RMRKNestableMultiAssetLazyMintErc20Soulbound.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNative.md b/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNative.md index 2c40ba43..9b4b29b6 100644 --- a/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNative.md +++ b/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNative.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNativeSoulbound.md b/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNativeSoulbound.md index ed98e1d4..dab084b5 100644 --- a/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNativeSoulbound.md +++ b/docs/implementations/lazyMintNative/RMRKEquippableLazyMintNativeSoulbound.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKNestableLazyMintNative.md b/docs/implementations/lazyMintNative/RMRKNestableLazyMintNative.md index c51ccedd..016c6623 100644 --- a/docs/implementations/lazyMintNative/RMRKNestableLazyMintNative.md +++ b/docs/implementations/lazyMintNative/RMRKNestableLazyMintNative.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKNestableLazyMintNativeSoulbound.md b/docs/implementations/lazyMintNative/RMRKNestableLazyMintNativeSoulbound.md index b4bfefc2..0cc8b304 100644 --- a/docs/implementations/lazyMintNative/RMRKNestableLazyMintNativeSoulbound.md +++ b/docs/implementations/lazyMintNative/RMRKNestableLazyMintNativeSoulbound.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNative.md b/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNative.md index 64053f1b..09f25da7 100644 --- a/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNative.md +++ b/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNative.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNativeSoulbound.md b/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNativeSoulbound.md index 6800ed77..c860e581 100644 --- a/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNativeSoulbound.md +++ b/docs/implementations/lazyMintNative/RMRKNestableMultiAssetLazyMintNativeSoulbound.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKEquippablePreMint.md b/docs/implementations/premint/RMRKEquippablePreMint.md index 5ef4c2a1..e4f02822 100644 --- a/docs/implementations/premint/RMRKEquippablePreMint.md +++ b/docs/implementations/premint/RMRKEquippablePreMint.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKEquippablePreMintSoulbound.md b/docs/implementations/premint/RMRKEquippablePreMintSoulbound.md index 09401a67..d04f86f1 100644 --- a/docs/implementations/premint/RMRKEquippablePreMintSoulbound.md +++ b/docs/implementations/premint/RMRKEquippablePreMintSoulbound.md @@ -354,7 +354,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKNestableMultiAssetPreMint.md b/docs/implementations/premint/RMRKNestableMultiAssetPreMint.md index d00d0094..7f7cb246 100644 --- a/docs/implementations/premint/RMRKNestableMultiAssetPreMint.md +++ b/docs/implementations/premint/RMRKNestableMultiAssetPreMint.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKNestableMultiAssetPreMintSoulbound.md b/docs/implementations/premint/RMRKNestableMultiAssetPreMintSoulbound.md index 2e5b8b71..ae7e42a7 100644 --- a/docs/implementations/premint/RMRKNestableMultiAssetPreMintSoulbound.md +++ b/docs/implementations/premint/RMRKNestableMultiAssetPreMintSoulbound.md @@ -304,7 +304,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKNestablePreMint.md b/docs/implementations/premint/RMRKNestablePreMint.md index 0808d03a..682e8a6d 100644 --- a/docs/implementations/premint/RMRKNestablePreMint.md +++ b/docs/implementations/premint/RMRKNestablePreMint.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters diff --git a/docs/implementations/premint/RMRKNestablePreMintSoulbound.md b/docs/implementations/premint/RMRKNestablePreMintSoulbound.md index 64626c7f..93b8bf64 100644 --- a/docs/implementations/premint/RMRKNestablePreMintSoulbound.md +++ b/docs/implementations/premint/RMRKNestablePreMintSoulbound.md @@ -229,7 +229,7 @@ function directOwnerOf(uint256 tokenId) external view returns (address owner_, u Used to retrieve the immediate owner of the given token. -*If the immediate owner is another token, the address returned, should be the one of the parent token's collection smart contract.* +*If the immediate owner is another token, the address returned will be the parent token's collection address.* #### Parameters From 02e5c0ee5be2ba9979c0e44ec7333e7031d8d902 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Sat, 2 Mar 2024 22:03:47 -0500 Subject: [PATCH 02/15] Bumps version to 2.5.1. --- contracts/RMRK/core/RMRKCore.sol | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RMRK/core/RMRKCore.sol b/contracts/RMRK/core/RMRKCore.sol index b35a881c..73b928b8 100644 --- a/contracts/RMRK/core/RMRKCore.sol +++ b/contracts/RMRK/core/RMRKCore.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.21; * @dev This is currently just a passthrough contract which allows for granular editing of base-level ERC721 functions. */ contract RMRKCore { - string private constant _VERSION = "2.5.0"; + string private constant _VERSION = "2.5.1"; bytes4 private constant _RMRK_INTERFACE = 0x524D524B; // "RMRK" in ASCII hex /** diff --git a/package.json b/package.json index 0f5166bc..eaa433ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rmrk-team/evm-contracts", - "version": "2.5.0", + "version": "2.5.1", "license": "Apache-2.0", "files": [ "contracts/RMRK/*", From af883ca2e305ab94b99f861cee6abc433ac132df Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 1 Mar 2024 15:14:51 -0500 Subject: [PATCH 03/15] Refactor on token attributes to reuse code and allow multiple collections and tokenIds on setters and getters. --- .../extension/tokenAttributes/IERC7508.sol | 100 +-- .../RMRKTokenAttributesRepository.sol | 604 +++++++------ test/extensions/tokenAttributesRepository.ts | 809 ++++++------------ 3 files changed, 661 insertions(+), 852 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol index 70fc8a5d..c0aa8735 100644 --- a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol +++ b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol @@ -326,13 +326,13 @@ interface IERC7508 is IERC165 { * string key, * string value * ] - * @param collection Address of the collection - * @param tokenId ID of the token + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributes An array of `StringAttribute` structs to be assigned to the given token */ function setStringAttributes( - address collection, - uint256 tokenId, + address[] memory collections, + uint256[] memory tokenIds, StringAttribute[] memory attributes ) external; @@ -343,13 +343,13 @@ interface IERC7508 is IERC165 { * string key, * uint value * ] - * @param collection Address of the collection - * @param tokenId ID of the token + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributes An array of `UintAttribute` structs to be assigned to the given token */ function setUintAttributes( - address collection, - uint256 tokenId, + address[] memory collections, + uint256[] memory tokenIds, UintAttribute[] memory attributes ) external; @@ -360,13 +360,13 @@ interface IERC7508 is IERC165 { * string key, * bool value * ] - * @param collection Address of the collection - * @param tokenId ID of the token + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributes An array of `BoolAttribute` structs to be assigned to the given token */ function setBoolAttributes( - address collection, - uint256 tokenId, + address[] memory collections, + uint256[] memory tokenIds, BoolAttribute[] memory attributes ) external; @@ -377,13 +377,13 @@ interface IERC7508 is IERC165 { * string key, * address value * ] - * @param collection Address of the collection - * @param tokenId ID of the token + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributes An array of `AddressAttribute` structs to be assigned to the given token */ function setAddressAttributes( - address collection, - uint256 tokenId, + address[] memory collections, + uint256[] memory tokenIds, AddressAttribute[] memory attributes ) external; @@ -394,13 +394,13 @@ interface IERC7508 is IERC165 { * string key, * bytes value * ] - * @param collection Address of the collection - * @param tokenId ID of the token + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributes An array of `BytesAttribute` structs to be assigned to the given token */ function setBytesAttributes( - address collection, - uint256 tokenId, + address[] memory collections, + uint256[] memory tokenIds, BytesAttribute[] memory attributes ) external; @@ -780,15 +780,15 @@ interface IERC7508 is IERC165 { * string key, * string value * ] - * @param collection Address of the collection the token belongs to - * @param tokenId ID of the token for which the attributes are being retrieved - * @param stringKeys An array of string keys to retrieve + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of string keys to retrieve * @return attributes An array of `StringAttribute` structs */ function getStringAttributes( - address collection, - uint256 tokenId, - string[] memory stringKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) external view returns (StringAttribute[] memory attributes); /** @@ -798,15 +798,15 @@ interface IERC7508 is IERC165 { * string key, * uint value * ] - * @param collection Address of the collection the token belongs to - * @param tokenId ID of the token for which the attributes are being retrieved - * @param uintKeys An array of uint keys to retrieve + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of uint keys to retrieve * @return attributes An array of `UintAttribute` structs */ function getUintAttributes( - address collection, - uint256 tokenId, - string[] memory uintKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) external view returns (UintAttribute[] memory attributes); /** @@ -816,15 +816,15 @@ interface IERC7508 is IERC165 { * string key, * bool value * ] - * @param collection Address of the collection the token belongs to - * @param tokenId ID of the token for which the attributes are being retrieved - * @param boolKeys An array of bool keys to retrieve + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of bool keys to retrieve * @return attributes An array of `BoolAttribute` structs */ function getBoolAttributes( - address collection, - uint256 tokenId, - string[] memory boolKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) external view returns (BoolAttribute[] memory attributes); /** @@ -834,15 +834,15 @@ interface IERC7508 is IERC165 { * string key, * address value * ] - * @param collection Address of the collection the token belongs to - * @param tokenId ID of the token for which the attributes are being retrieved - * @param addressKeys An array of address keys to retrieve + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of address keys to retrieve * @return attributes An array of `AddressAttribute` structs */ function getAddressAttributes( - address collection, - uint256 tokenId, - string[] memory addressKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) external view returns (AddressAttribute[] memory attributes); /** @@ -852,14 +852,14 @@ interface IERC7508 is IERC165 { * string key, * bytes value * ] - * @param collection Address of the collection the token belongs to - * @param tokenId ID of the token for which the attributes are being retrieved - * @param bytesKeys An array of bytes keys to retrieve + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of bytes keys to retrieve * @return attributes An array of `BytesAttribute` structs */ function getBytesAttributes( - address collection, - uint256 tokenId, - string[] memory bytesKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) external view returns (BytesAttribute[] memory attributes); } diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index a31bef1f..bf647086 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -44,35 +44,29 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { "setAddressAttribute(address collection,uint256 tokenId,string memory key,address value)" ); - mapping(address => mapping(uint256 => AccessType)) + mapping(address collection => mapping(uint256 => AccessType)) private _parameterAccessType; - mapping(address => mapping(uint256 => address)) + mapping(address collection => mapping(uint256 => address)) private _parameterSpecificAddress; - mapping(address => IssuerSetting) private _issuerSettings; - mapping(address => mapping(address => bool)) private _collaborators; + mapping(address collection => IssuerSetting) private _issuerSettings; + mapping(address collection => mapping(address collaborator => bool)) + private _collaborators; // For keys, we use a mapping from strings to IDs. // The purpose is to store unique string keys only once, since they are more expensive. mapping(string => uint256) private _keysToIds; uint256 private _totalAttributes; - // For strings, we also use a mapping from strings to IDs, together with a reverse mapping - // The purpose is to store unique string values only once, since they are more expensive, - // and storing only IDs. - mapping(address => uint256) private _totalStringValues; - mapping(address => mapping(string => uint256)) private _stringValueToId; - mapping(address => mapping(uint256 => string)) private _stringIdToValue; - mapping(address => mapping(uint256 => mapping(uint256 => uint256))) - private _stringValueIds; - - mapping(address => mapping(uint256 => mapping(uint256 => address))) + mapping(address collection => mapping(uint256 => mapping(uint256 => address))) private _addressValues; - mapping(address => mapping(uint256 => mapping(uint256 => bytes))) + mapping(address collection => mapping(uint256 => mapping(uint256 => bytes))) private _bytesValues; - mapping(address => mapping(uint256 => mapping(uint256 => uint256))) + mapping(address collection => mapping(uint256 => mapping(uint256 => uint256))) private _uintValues; - mapping(address => mapping(uint256 => mapping(uint256 => bool))) + mapping(address collection => mapping(uint256 => mapping(uint256 => bool))) private _boolValues; + mapping(address collection => mapping(uint256 => mapping(uint256 => string))) + private _stringValues; struct IssuerSetting { bool registered; @@ -80,6 +74,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address issuer; } + /// Used to signal that the length of the arrays is not equal. + error LengthsMismatch(); /// Used to signal that the smart contract interacting with the repository does not implement Ownable pattern. error OwnableNotImplemented(); /// Used to signal that the caller is not the issuer of the collection. @@ -88,8 +84,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { error CollaboratorArraysNotEqualLength(); /// Used to signal that the collection is not registered in the repository yet. error CollectionNotRegistered(); - /// Used to signal that the collection is already registered in the repository. - error CollectionAlreadyRegistered(); /// Used to signal that the caller is not aa collaborator of the collection. error NotCollectionCollaborator(); /// Used to signal that the caller is not the issuer or a collaborator of the collection. @@ -110,7 +104,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, address issuer, bool useOwnable - ) external onlyUnregisteredCollection(collection) { + ) external { (bool ownableSuccess, bytes memory ownableReturn) = collection.call( abi.encodeWithSignature("owner()") ); @@ -125,10 +119,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { revert NotCollectionIssuer(); } - IssuerSetting storage issuerSetting = _issuerSettings[collection]; - issuerSetting.registered = true; - issuerSetting.issuer = issuer; - issuerSetting.useOwnable = useOwnable; + _issuerSettings[collection] = IssuerSetting({ + registered: true, + issuer: issuer, + useOwnable: useOwnable + }); emit AccessControlRegistration( collection, @@ -235,17 +230,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { _; } - /** - * @notice Modifier to check if the collection is not registered. - * @param collection Address of the collection. - */ - modifier onlyUnregisteredCollection(address collection) { - if (_issuerSettings[collection].registered) { - revert CollectionAlreadyRegistered(); - } - _; - } - /** * @notice Modifier to check if the caller is the issuer of the collection. * @param collection Address of the collection. @@ -319,11 +303,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, uint256 tokenId, string memory key - ) external view returns (string memory attribute) { - uint256 idForValue = _stringValueIds[collection][tokenId][ - _keysToIds[key] - ]; - attribute = _stringIdToValue[collection][idForValue]; + ) public view returns (string memory attribute) { + attribute = _stringValues[collection][tokenId][_keysToIds[key]]; } /** @@ -333,7 +314,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, uint256 tokenId, string memory key - ) external view returns (uint256 attribute) { + ) public view returns (uint256 attribute) { attribute = _uintValues[collection][tokenId][_keysToIds[key]]; } @@ -344,7 +325,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, uint256 tokenId, string memory key - ) external view returns (bool attribute) { + ) public view returns (bool attribute) { attribute = _boolValues[collection][tokenId][_keysToIds[key]]; } @@ -355,7 +336,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, uint256 tokenId, string memory key - ) external view returns (address attribute) { + ) public view returns (address attribute) { attribute = _addressValues[collection][tokenId][_keysToIds[key]]; } @@ -366,7 +347,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, uint256 tokenId, string memory key - ) external view returns (bytes memory attribute) { + ) public view returns (bytes memory attribute) { attribute = _bytesValues[collection][tokenId][_keysToIds[key]]; } @@ -392,41 +373,50 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { BytesAttribute[] memory bytesAttributes ) { - stringAttributes = getStringAttributes(collection, tokenId, stringKeys); - - uintAttributes = getUintAttributes(collection, tokenId, uintKeys); - - boolAttributes = getBoolAttributes(collection, tokenId, boolKeys); - + address[] memory collections = new address[](1); + uint256[] memory tokenIds = new uint256[](1); + collections[0] = collection; + tokenIds[0] = tokenId; + + stringAttributes = getStringAttributes( + collections, + tokenIds, + stringKeys + ); + uintAttributes = getUintAttributes(collections, tokenIds, uintKeys); + boolAttributes = getBoolAttributes(collections, tokenIds, boolKeys); addressAttributes = getAddressAttributes( - collection, - tokenId, + collections, + tokenIds, addressKeys ); - - bytesAttributes = getBytesAttributes(collection, tokenId, bytesKeys); + bytesAttributes = getBytesAttributes(collections, tokenIds, bytesKeys); } /** * @inheritdoc IERC7508 */ function getStringAttributes( - address collection, - uint256 tokenId, - string[] memory stringKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) public view returns (StringAttribute[] memory attributes) { - uint256 stringLen = stringKeys.length; + uint256 length = attributeKeys.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - attributes = new StringAttribute[](stringLen); + attributes = new StringAttribute[](length); - for (uint256 i; i < stringLen; ) { + for (uint256 i; i < length; ) { attributes[i] = StringAttribute({ - key: stringKeys[i], - value: _stringIdToValue[collection][ - _stringValueIds[collection][tokenId][ - _keysToIds[stringKeys[i]] - ] - ] + key: attributeKeys[i], + value: getStringAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attributeKeys[i] + ) }); unchecked { ++i; @@ -438,18 +428,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { * @inheritdoc IERC7508 */ function getUintAttributes( - address collection, - uint256 tokenId, - string[] memory uintKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) public view returns (UintAttribute[] memory attributes) { - uint256 uintLen = uintKeys.length; + uint256 length = attributeKeys.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - attributes = new UintAttribute[](uintLen); + attributes = new UintAttribute[](length); - for (uint256 i; i < uintLen; ) { + for (uint256 i; i < length; ) { attributes[i] = UintAttribute({ - key: uintKeys[i], - value: _uintValues[collection][tokenId][_keysToIds[uintKeys[i]]] + key: attributeKeys[i], + value: getUintAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attributeKeys[i] + ) }); unchecked { ++i; @@ -461,18 +459,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { * @inheritdoc IERC7508 */ function getBoolAttributes( - address collection, - uint256 tokenId, - string[] memory boolKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) public view returns (BoolAttribute[] memory attributes) { - uint256 boolLen = boolKeys.length; + uint256 length = attributeKeys.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - attributes = new BoolAttribute[](boolLen); + attributes = new BoolAttribute[](length); - for (uint256 i; i < boolLen; ) { + for (uint256 i; i < length; ) { attributes[i] = BoolAttribute({ - key: boolKeys[i], - value: _boolValues[collection][tokenId][_keysToIds[boolKeys[i]]] + key: attributeKeys[i], + value: getBoolAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attributeKeys[i] + ) }); unchecked { ++i; @@ -484,19 +490,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { * @inheritdoc IERC7508 */ function getAddressAttributes( - address collection, - uint256 tokenId, - string[] memory addressKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) public view returns (AddressAttribute[] memory attributes) { - uint256 addressLen = addressKeys.length; - attributes = new AddressAttribute[](addressLen); + uint256 length = attributeKeys.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i; i < addressLen; ) { + attributes = new AddressAttribute[](length); + + for (uint256 i; i < length; ) { attributes[i] = AddressAttribute({ - key: addressKeys[i], - value: _addressValues[collection][tokenId][ - _keysToIds[addressKeys[i]] - ] + key: attributeKeys[i], + value: getAddressAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attributeKeys[i] + ) }); unchecked { ++i; @@ -508,19 +521,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { * @inheritdoc IERC7508 */ function getBytesAttributes( - address collection, - uint256 tokenId, - string[] memory bytesKeys + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys ) public view returns (BytesAttribute[] memory attributes) { - uint256 bytesLen = bytesKeys.length; - attributes = new BytesAttribute[](bytesLen); + uint256 length = attributeKeys.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + + attributes = new BytesAttribute[](length); - for (uint256 i; i < bytesLen; ) { + for (uint256 i; i < length; ) { attributes[i] = BytesAttribute({ - key: bytesKeys[i], - value: _bytesValues[collection][tokenId][ - _keysToIds[bytesKeys[i]] - ] + key: attributeKeys[i], + value: getBytesAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attributeKeys[i] + ) }); unchecked { ++i; @@ -646,84 +666,83 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setUintAttribute( + function setBoolAttribute( address collection, uint256 tokenId, string memory key, - uint256 value - ) external onlyAuthorizedCaller(collection, key, tokenId) { - _uintValues[collection][tokenId][_getIdForKey(key)] = value; - emit UintAttributeUpdated(collection, tokenId, key, value); + bool value + ) external { + _setBoolAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setStringAttribute( + function setBytesAttribute( address collection, uint256 tokenId, string memory key, - string memory value - ) external onlyAuthorizedCaller(collection, key, tokenId) { - _stringValueIds[collection][tokenId][ - _getIdForKey(key) - ] = _getStringIdForValue(collection, value); - emit StringAttributeUpdated(collection, tokenId, key, value); + bytes memory value + ) external { + _setBytesAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setBoolAttribute( + function setAddressAttribute( address collection, uint256 tokenId, string memory key, - bool value - ) external onlyAuthorizedCaller(collection, key, tokenId) { - _boolValues[collection][tokenId][_getIdForKey(key)] = value; - emit BoolAttributeUpdated(collection, tokenId, key, value); + address value + ) external { + _setAddressAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setBytesAttribute( + function setUintAttribute( address collection, uint256 tokenId, string memory key, - bytes memory value - ) external onlyAuthorizedCaller(collection, key, tokenId) { - _bytesValues[collection][tokenId][_getIdForKey(key)] = value; - emit BytesAttributeUpdated(collection, tokenId, key, value); + uint256 value + ) external { + _setUintAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setAddressAttribute( + function setStringAttribute( address collection, uint256 tokenId, string memory key, - address value - ) external onlyAuthorizedCaller(collection, key, tokenId) { - _addressValues[collection][tokenId][_getIdForKey(key)] = value; - emit AddressAttributeUpdated(collection, tokenId, key, value); + string memory value + ) external { + _setStringAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setStringAttributes( - address collection, - uint256 tokenId, - StringAttribute[] memory attributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + function setBoolAttributes( + address[] memory collections, + uint256[] memory tokenIds, + BoolAttribute[] memory attributes + ) external { uint256 length = attributes.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); for (uint256 i = 0; i < length; ) { - _stringValueIds[collection][tokenId][ - _getIdForKey(attributes[i].key) - ] = _getStringIdForValue(collection, attributes[i].value); - emit StringAttributeUpdated( + address collection = multipleCollections + ? collections[i] + : collections[0]; + uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + _setBoolAttribute( + _msgSender(), collection, tokenId, attributes[i].key, @@ -738,17 +757,23 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setUintAttributes( - address collection, - uint256 tokenId, - UintAttribute[] memory attributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + function setBytesAttributes( + address[] memory collections, + uint256[] memory tokenIds, + BytesAttribute[] memory attributes + ) external { uint256 length = attributes.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); for (uint256 i = 0; i < length; ) { - _uintValues[collection][tokenId][ - _getIdForKey(attributes[i].key) - ] = attributes[i].value; - emit UintAttributeUpdated( + address collection = multipleCollections + ? collections[i] + : collections[0]; + uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + _setBytesAttribute( + _msgSender(), collection, tokenId, attributes[i].key, @@ -763,17 +788,23 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setBoolAttributes( - address collection, - uint256 tokenId, - BoolAttribute[] memory attributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + function setStringAttributes( + address[] memory collections, + uint256[] memory tokenIds, + StringAttribute[] memory attributes + ) external { uint256 length = attributes.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); for (uint256 i = 0; i < length; ) { - _boolValues[collection][tokenId][ - _getIdForKey(attributes[i].key) - ] = attributes[i].value; - emit BoolAttributeUpdated( + address collection = multipleCollections + ? collections[i] + : collections[0]; + uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + _setStringAttribute( + _msgSender(), collection, tokenId, attributes[i].key, @@ -788,17 +819,23 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setAddressAttributes( - address collection, - uint256 tokenId, - AddressAttribute[] memory attributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + function setUintAttributes( + address[] memory collections, + uint256[] memory tokenIds, + UintAttribute[] memory attributes + ) external { uint256 length = attributes.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); for (uint256 i = 0; i < length; ) { - _addressValues[collection][tokenId][ - _getIdForKey(attributes[i].key) - ] = attributes[i].value; - emit AddressAttributeUpdated( + address collection = multipleCollections + ? collections[i] + : collections[0]; + uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + _setUintAttribute( + _msgSender(), collection, tokenId, attributes[i].key, @@ -813,17 +850,23 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setBytesAttributes( - address collection, - uint256 tokenId, - BytesAttribute[] memory attributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + function setAddressAttributes( + address[] memory collections, + uint256[] memory tokenIds, + AddressAttribute[] memory attributes + ) external { uint256 length = attributes.length; + ( + bool multipleCollections, + bool multipleTokens + ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); for (uint256 i = 0; i < length; ) { - _bytesValues[collection][tokenId][ - _getIdForKey(attributes[i].key) - ] = attributes[i].value; - emit BytesAttributeUpdated( + address collection = multipleCollections + ? collections[i] + : collections[0]; + uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + _setAddressAttribute( + _msgSender(), collection, tokenId, attributes[i].key, @@ -846,13 +889,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { BoolAttribute[] memory boolAttributes, AddressAttribute[] memory addressAttributes, BytesAttribute[] memory bytesAttributes - ) external onlyAuthorizedCaller(collection, "", tokenId) { + ) external { uint256 length = stringAttributes.length; for (uint256 i = 0; i < length; ) { - _stringValueIds[collection][tokenId][ - _getIdForKey(stringAttributes[i].key) - ] = _getStringIdForValue(collection, stringAttributes[i].value); - emit StringAttributeUpdated( + _setStringAttribute( + _msgSender(), collection, tokenId, stringAttributes[i].key, @@ -865,10 +906,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { length = uintAttributes.length; for (uint256 i = 0; i < length; ) { - _uintValues[collection][tokenId][ - _getIdForKey(uintAttributes[i].key) - ] = uintAttributes[i].value; - emit UintAttributeUpdated( + _setUintAttribute( + _msgSender(), collection, tokenId, uintAttributes[i].key, @@ -881,10 +920,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { length = boolAttributes.length; for (uint256 i = 0; i < length; ) { - _boolValues[collection][tokenId][ - _getIdForKey(boolAttributes[i].key) - ] = boolAttributes[i].value; - emit BoolAttributeUpdated( + _setBoolAttribute( + _msgSender(), collection, tokenId, boolAttributes[i].key, @@ -897,10 +934,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { length = addressAttributes.length; for (uint256 i = 0; i < length; ) { - _addressValues[collection][tokenId][ - _getIdForKey(addressAttributes[i].key) - ] = addressAttributes[i].value; - emit AddressAttributeUpdated( + _setAddressAttribute( + _msgSender(), collection, tokenId, addressAttributes[i].key, @@ -913,10 +948,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { length = bytesAttributes.length; for (uint256 i = 0; i < length; ) { - _bytesValues[collection][tokenId][ - _getIdForKey(bytesAttributes[i].key) - ] = bytesAttributes[i].value; - emit BytesAttributeUpdated( + _setBytesAttribute( + _msgSender(), collection, tokenId, bytesAttributes[i].key, @@ -928,6 +961,81 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + function _checkIfMultipleCollectionsAndTokens( + address[] memory collections, + uint256[] memory tokenIds, + uint256 attributesLength + ) internal pure returns (bool multipleCollections, bool multipleTokens) { + multipleCollections = collections.length != 1; + multipleTokens = tokenIds.length != 1; + if ( + (multipleCollections && collections.length != attributesLength) || + (multipleTokens && tokenIds.length != attributesLength) + ) { + revert LengthsMismatch(); + } + } + + function _setBoolAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + bool value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _boolValues[collection][tokenId][_getIdForKey(key)] = value; + emit BoolAttributeUpdated(collection, tokenId, key, value); + } + + function _setBytesAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + bytes memory value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _bytesValues[collection][tokenId][_getIdForKey(key)] = value; + emit BytesAttributeUpdated(collection, tokenId, key, value); + } + + function _setAddressAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + address value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _addressValues[collection][tokenId][_getIdForKey(key)] = value; + emit AddressAttributeUpdated(collection, tokenId, key, value); + } + + function _setStringAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + string memory value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _stringValues[collection][tokenId][_getIdForKey(key)] = value; + emit StringAttributeUpdated(collection, tokenId, key, value); + } + + function _setUintAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + uint256 value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _uintValues[collection][tokenId][_getIdForKey(key)] = value; + emit UintAttributeUpdated(collection, tokenId, key, value); + } + /** * @inheritdoc IERC7508 */ @@ -942,10 +1050,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { bytes32 r, bytes32 s ) external { - if (block.timestamp > deadline) { - revert ExpiredDeadline(); - } - bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", @@ -962,14 +1066,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ) ); - address signer = ecrecover(digest, v, r, s); - if (signer != setter) { - revert InvalidSignature(); - } - _onlyAuthorizedCaller(signer, collection, key, tokenId); - - _uintValues[collection][tokenId][_getIdForKey(key)] = value; - emit UintAttributeUpdated(collection, tokenId, key, value); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setUintAttribute(setter, collection, tokenId, key, value); } /** @@ -986,10 +1084,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { bytes32 r, bytes32 s ) external { - if (block.timestamp > deadline) { - revert ExpiredDeadline(); - } - bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", @@ -1006,16 +1100,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ) ); - address signer = ecrecover(digest, v, r, s); - if (signer != setter) { - revert InvalidSignature(); - } - _onlyAuthorizedCaller(signer, collection, key, tokenId); - - _stringValueIds[collection][tokenId][ - _getIdForKey(key) - ] = _getStringIdForValue(collection, value); - emit StringAttributeUpdated(collection, tokenId, key, value); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setStringAttribute(setter, collection, tokenId, key, value); } /** @@ -1032,10 +1118,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { bytes32 r, bytes32 s ) external { - if (block.timestamp > deadline) { - revert ExpiredDeadline(); - } - bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", @@ -1052,14 +1134,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ) ); - address signer = ecrecover(digest, v, r, s); - if (signer != setter) { - revert InvalidSignature(); - } - _onlyAuthorizedCaller(signer, collection, key, tokenId); - - _boolValues[collection][tokenId][_getIdForKey(key)] = value; - emit BoolAttributeUpdated(collection, tokenId, key, value); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setBoolAttribute(setter, collection, tokenId, key, value); } /** @@ -1076,10 +1152,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { bytes32 r, bytes32 s ) external { - if (block.timestamp > deadline) { - revert ExpiredDeadline(); - } - bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", @@ -1096,14 +1168,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ) ); - address signer = ecrecover(digest, v, r, s); - if (signer != setter) { - revert InvalidSignature(); - } - _onlyAuthorizedCaller(signer, collection, key, tokenId); - - _bytesValues[collection][tokenId][_getIdForKey(key)] = value; - emit BytesAttributeUpdated(collection, tokenId, key, value); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setBytesAttribute(setter, collection, tokenId, key, value); } /** @@ -1120,10 +1186,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { bytes32 r, bytes32 s ) external { - if (block.timestamp > deadline) { - revert ExpiredDeadline(); - } - bytes32 digest = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", @@ -1140,14 +1202,25 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ) ); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setAddressAttribute(setter, collection, tokenId, key, value); + } + + function _checkDeadlineAndSigner( + address setter, + uint256 deadline, + bytes32 digest, + uint8 v, + bytes32 r, + bytes32 s + ) internal view { + if (block.timestamp > deadline) { + revert ExpiredDeadline(); + } address signer = ecrecover(digest, v, r, s); if (signer != setter) { revert InvalidSignature(); } - _onlyAuthorizedCaller(signer, collection, key, tokenId); - - _addressValues[collection][tokenId][_getIdForKey(key)] = value; - emit AddressAttributeUpdated(collection, tokenId, key, value); } /** @@ -1167,31 +1240,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } - /** - * @notice Used to get the ID for a string value. If the value does not exist, a new ID is created. - * @dev IDs are shared among all tokens and used only for strings. - * @param collection Address of the collection being checked for string ID - * @param value The attribute value - * @return stringId The id for the string value - */ - function _getStringIdForValue( - address collection, - string memory value - ) internal returns (uint256 stringId) { - if (_stringValueToId[collection][value] == 0) { - _totalStringValues[collection]++; - _stringValueToId[collection][value] = _totalStringValues[ - collection - ]; - _stringIdToValue[collection][ - _totalStringValues[collection] - ] = value; - stringId = _totalStringValues[collection]; - } else { - stringId = _stringValueToId[collection][value]; - } - } - /** * @inheritdoc IERC165 */ diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 7af82d34..76f89c74 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -40,12 +40,14 @@ describe('RMRKTokenAttributesRepository', async function () { let collectionOwner: SignerWithAddress; let tokenOwner: SignerWithAddress; let collaborator: SignerWithAddress; + let collectionAddress: string; const tokenId = 1n; const tokenId2 = 2n; beforeEach(async function () { tokenAttributes = await loadFixture(tokenAttributesFixture); ownedCollection = await loadFixture(ownedCollectionFixture); + collectionAddress = await ownedCollection.getAddress(); [collectionOwner, tokenOwner, collaborator] = await ethers.getSigners(); this.tokenAttributes = tokenAttributes; @@ -57,7 +59,7 @@ describe('RMRKTokenAttributesRepository', async function () { describe('Registering attributes and setting values', async function () { beforeEach(async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -66,156 +68,90 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set and get token attributes', async function () { expect( await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'description', 'test description', ), ) .to.emit(tokenAttributes, 'StringAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'description', 'test description'); + .withArgs(collectionAddress, tokenId, 'description', 'test description'); expect( await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'description1', 'test description', ), ) .to.emit(tokenAttributes, 'StringAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'description1', 'test description'); - expect( - await tokenAttributes.setBoolAttribute( - await ownedCollection.getAddress(), - tokenId, - 'rare', - true, - ), - ) + .withArgs(collectionAddress, tokenId, 'description1', 'test description'); + expect(await tokenAttributes.setBoolAttribute(collectionAddress, tokenId, 'rare', true)) .to.emit(tokenAttributes, 'BoolAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'rare', true); + .withArgs(collectionAddress, tokenId, 'rare', true); expect( await tokenAttributes.setAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'owner', tokenOwner.address, ), ) .to.emit(tokenAttributes, 'AddressAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'owner', tokenOwner.address); - expect( - await tokenAttributes.setUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'atk', - 100n, - ), - ) + .withArgs(collectionAddress, tokenId, 'owner', tokenOwner.address); + expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'atk', 100n)) .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'atk', 100n); - expect( - await tokenAttributes.setUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'health', - 100n, - ), - ) + .withArgs(collectionAddress, tokenId, 'atk', 100n); + expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 100n)) .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 100n); - expect( - await tokenAttributes.setUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'health', - 95n, - ), - ) + .withArgs(collectionAddress, tokenId, 'health', 100n); + expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 95n)) .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 95n); - expect( - await tokenAttributes.setUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'health', - 80n, - ), - ) + .withArgs(collectionAddress, tokenId, 'health', 95n); + expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 80n)) .to.emit(tokenAttributes, 'UintAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'health', 80n); - expect( - await tokenAttributes.setBytesAttribute( - await ownedCollection.getAddress(), - tokenId, - 'data', - '0x1234', - ), - ) + .withArgs(collectionAddress, tokenId, 'health', 80n); + expect(await tokenAttributes.setBytesAttribute(collectionAddress, tokenId, 'data', '0x1234')) .to.emit(tokenAttributes, 'BytesAttributeSet') - .withArgs(await ownedCollection.getAddress(), tokenId, 'data', '0x1234'); + .withArgs(collectionAddress, tokenId, 'data', '0x1234'); expect( - await tokenAttributes.getStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'description', - ), + await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'description'), ).to.eql('test description'); expect( - await tokenAttributes.getStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'description1', - ), + await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'description1'), ).to.eql('test description'); - expect( - await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'rare'), - ).to.eql(true); - expect( - await tokenAttributes.getAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'owner', - ), - ).to.eql(tokenOwner.address); - expect( - await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'atk'), - ).to.eql(100n); - expect( - await tokenAttributes.getUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'health', - ), - ).to.eql(80n); - expect( - await tokenAttributes.getBytesAttribute( - await ownedCollection.getAddress(), - tokenId, - 'data', - ), - ).to.eql('0x1234'); + expect(await tokenAttributes.getBoolAttribute(collectionAddress, tokenId, 'rare')).to.eql( + true, + ); + expect(await tokenAttributes.getAddressAttribute(collectionAddress, tokenId, 'owner')).to.eql( + tokenOwner.address, + ); + expect(await tokenAttributes.getUintAttribute(collectionAddress, tokenId, 'atk')).to.eql( + 100n, + ); + expect(await tokenAttributes.getUintAttribute(collectionAddress, tokenId, 'health')).to.eql( + 80n, + ); + expect(await tokenAttributes.getBytesAttribute(collectionAddress, tokenId, 'data')).to.eql( + '0x1234', + ); await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'description', 'test description update', ); expect( - await tokenAttributes.getStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'description', - ), + await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'description'), ).to.eql('test description update'); }); it('can set multiple attributes of multiple types at the same time', async function () { await expect( tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [ { key: 'string1', value: 'value1' }, @@ -240,35 +176,30 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .withArgs(collectionAddress, tokenId, 'string2', 'value2') .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .withArgs(collectionAddress, tokenId, 'uint2', 2n) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .withArgs(collectionAddress, tokenId, 'bool2', false) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', tokenOwner.address) + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs( - await ownedCollection.getAddress(), - tokenId, - 'address2', - await collectionOwner.getAddress(), - ) + .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); }); it('can update multiple attributes of multiple types at the same time', async function () { await tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [ { key: 'string1', value: 'value0' }, @@ -294,7 +225,7 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [ { key: 'string1', value: 'value1' }, @@ -319,35 +250,30 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .withArgs(collectionAddress, tokenId, 'string2', 'value2') .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .withArgs(collectionAddress, tokenId, 'uint2', 2n) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .withArgs(collectionAddress, tokenId, 'bool2', false) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', tokenOwner.address) + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs( - await ownedCollection.getAddress(), - tokenId, - 'address2', - await collectionOwner.getAddress(), - ) + .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); }); it('can set and update multiple attributes of multiple types at the same time even if not all types are updated at the same time', async function () { await tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [{ key: 'string1', value: 'value0' }], [ @@ -367,7 +293,7 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], [ @@ -389,30 +315,25 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .withArgs(collectionAddress, tokenId, 'uint2', 2n) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .withArgs(collectionAddress, tokenId, 'bool2', false) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', tokenOwner.address) + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs( - await ownedCollection.getAddress(), - tokenId, - 'address2', - await collectionOwner.getAddress(), - ) + .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); await expect( tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], [], @@ -425,15 +346,15 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', false) + .withArgs(collectionAddress, tokenId, 'bool1', false) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', true); + .withArgs(collectionAddress, tokenId, 'bool2', true); }); it('can set and update multiple attributes of multiple types at the same time', async function () { await expect( tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [ { key: 'string1', value: 'value1' }, @@ -458,35 +379,30 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2') + .withArgs(collectionAddress, tokenId, 'string2', 'value2') .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n) + .withArgs(collectionAddress, tokenId, 'uint2', 2n) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false) + .withArgs(collectionAddress, tokenId, 'bool2', false) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', tokenOwner.address) + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs( - await ownedCollection.getAddress(), - tokenId, - 'address2', - await collectionOwner.getAddress(), - ) + .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); }); it('should allow to retrieve multiple attributes at once', async function () { await tokenAttributes.setAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [ { key: 'string1', value: 'value1' }, @@ -512,7 +428,7 @@ describe('RMRKTokenAttributesRepository', async function () { expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, ['string1', 'string2'], ['uint1', 'uint2'], @@ -546,19 +462,23 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set multiple string attributes at the same time', async function () { await expect( - tokenAttributes.setStringAttributes(await ownedCollection.getAddress(), tokenId, [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ]), + tokenAttributes.setStringAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string1', 'value1') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'string2', 'value2'); + .withArgs(collectionAddress, tokenId, 'string2', 'value2'); expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, ['string1', 'string2'], [], @@ -580,19 +500,23 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set multiple uint attributes at the same time', async function () { await expect( - tokenAttributes.setUintAttributes(await ownedCollection.getAddress(), tokenId, [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, - ]), + tokenAttributes.setUintAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), ) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint1', 1n) + .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'uint2', 2n); + .withArgs(collectionAddress, tokenId, 'uint2', 2n); expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], ['uint1', 'uint2'], @@ -614,19 +538,23 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set multiple bool attributes at the same time', async function () { await expect( - tokenAttributes.setBoolAttributes(await ownedCollection.getAddress(), tokenId, [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ]), + tokenAttributes.setBoolAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), ) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool1', true) + .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bool2', false); + .withArgs(collectionAddress, tokenId, 'bool2', false); expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], [], @@ -648,24 +576,23 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set multiple address attributes at the same time', async function () { await expect( - tokenAttributes.setAddressAttributes(await ownedCollection.getAddress(), tokenId, [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ]), + tokenAttributes.setAddressAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: await collectionOwner.getAddress() }, + ], + ), ) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'address1', tokenOwner.address) + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs( - await ownedCollection.getAddress(), - tokenId, - 'address2', - await collectionOwner.getAddress(), - ); + .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()); expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], [], @@ -687,19 +614,23 @@ describe('RMRKTokenAttributesRepository', async function () { it('can set multiple bytes attributes at the same time', async function () { await expect( - tokenAttributes.setBytesAttributes(await ownedCollection.getAddress(), tokenId, [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ]), + tokenAttributes.setBytesAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), ) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes1', '0x1234') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), tokenId, 'bytes2', '0x5678'); + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); expect( await tokenAttributes.getAttributes( - await ownedCollection.getAddress(), + collectionAddress, tokenId, [], [], @@ -720,119 +651,71 @@ describe('RMRKTokenAttributesRepository', async function () { }); it('can reuse keys and values are fine', async function () { - await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', + await tokenAttributes.setStringAttribute(collectionAddress, tokenId, 'X', 'X1'); + await tokenAttributes.setStringAttribute(collectionAddress, tokenId2, 'X', 'X2'); + + expect(await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'X')).to.eql( 'X1', ); - await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), - tokenId2, - 'X', + expect(await tokenAttributes.getStringAttribute(collectionAddress, tokenId2, 'X')).to.eql( 'X2', ); - - expect( - await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql('X1'); - expect( - await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), - ).to.eql('X2'); }); it('can reuse keys among different attributes and values are fine', async function () { - await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - 'test description', - ); - await tokenAttributes.setBoolAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - true, - ); + await tokenAttributes.setStringAttribute(collectionAddress, tokenId, 'X', 'test description'); + await tokenAttributes.setBoolAttribute(collectionAddress, tokenId, 'X', true); await tokenAttributes.setAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, ); - await tokenAttributes.setUintAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - 100n, + await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'X', 100n); + await tokenAttributes.setBytesAttribute(collectionAddress, tokenId, 'X', '0x1234'); + + expect(await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'X')).to.eql( + 'test description', ); - await tokenAttributes.setBytesAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', + expect(await tokenAttributes.getBoolAttribute(collectionAddress, tokenId, 'X')).to.eql(true); + expect(await tokenAttributes.getAddressAttribute(collectionAddress, tokenId, 'X')).to.eql( + tokenOwner.address, + ); + expect(await tokenAttributes.getUintAttribute(collectionAddress, tokenId, 'X')).to.eql(100n); + expect(await tokenAttributes.getBytesAttribute(collectionAddress, tokenId, 'X')).to.eql( '0x1234', ); - - expect( - await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql('test description'); - expect( - await tokenAttributes.getBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql(true); - expect( - await tokenAttributes.getAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql(tokenOwner.address); - expect( - await tokenAttributes.getUintAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql(100n); - expect( - await tokenAttributes.getBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql('0x1234'); }); it('can reuse string values and values are fine', async function () { - await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', + await tokenAttributes.setStringAttribute(collectionAddress, tokenId, 'X', 'common string'); + await tokenAttributes.setStringAttribute(collectionAddress, tokenId2, 'X', 'common string'); + + expect(await tokenAttributes.getStringAttribute(collectionAddress, tokenId, 'X')).to.eql( 'common string', ); - await tokenAttributes.setStringAttribute( - await ownedCollection.getAddress(), - tokenId2, - 'X', + expect(await tokenAttributes.getStringAttribute(collectionAddress, tokenId2, 'X')).to.eql( 'common string', ); - - expect( - await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId, 'X'), - ).to.eql('common string'); - expect( - await tokenAttributes.getStringAttribute(await ownedCollection.getAddress(), tokenId2, 'X'), - ).to.eql('common string'); }); it('should not allow to set string values to unauthorized caller', async function () { await expect( tokenAttributes .connect(tokenOwner) - .setStringAttribute(await ownedCollection.getAddress(), tokenId, 'X', 'test description'), + .setStringAttribute(collectionAddress, tokenId, 'X', 'test description'), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); it('should not allow to set uint values to unauthorized caller', async function () { await expect( - tokenAttributes - .connect(tokenOwner) - .setUintAttribute(await ownedCollection.getAddress(), tokenId, 'X', 42n), + tokenAttributes.connect(tokenOwner).setUintAttribute(collectionAddress, tokenId, 'X', 42n), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); it('should not allow to set boolean values to unauthorized caller', async function () { await expect( - tokenAttributes - .connect(tokenOwner) - .setBoolAttribute(await ownedCollection.getAddress(), tokenId, 'X', true), + tokenAttributes.connect(tokenOwner).setBoolAttribute(collectionAddress, tokenId, 'X', true), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); @@ -840,12 +723,7 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); @@ -853,37 +731,33 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes .connect(tokenOwner) - .setBytesAttribute(await ownedCollection.getAddress(), tokenId, 'X', '0x1234'), + .setBytesAttribute(collectionAddress, tokenId, 'X', '0x1234'), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); }); describe('Token attributes access control', async function () { - it('should not allow registering an already registered collection', async function () { + it('should allow registering an already registered collection', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); await expect( tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionAlreadyRegistered'); + ).to.emit(tokenAttributes, 'AccessControlRegistration'); }); it('should not allow to register a collection if caller is not the owner of the collection', async function () { await expect( tokenAttributes .connect(tokenOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - true, - ), + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); @@ -901,7 +775,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should allow to manage access control for registered collections', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -910,19 +784,19 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, tokenOwner.address, ), ) .to.emit(tokenAttributes, 'AccessControlUpdate') - .withArgs(await ownedCollection.getAddress(), 'X', 2, tokenOwner); + .withArgs(collectionAddress, 'X', 2, tokenOwner); }); it('should allow issuer to manage collaborators', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -930,23 +804,23 @@ describe('RMRKTokenAttributesRepository', async function () { expect( await tokenAttributes .connect(collectionOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]), + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]), ) .to.emit(tokenAttributes, 'CollaboratorUpdate') - .withArgs(await ownedCollection.getAddress(), [tokenOwner.address], [true]); + .withArgs(collectionAddress, [tokenOwner.address], [true]); }); it('should not allow to manage collaborators of an unregistered collection', async function () { await expect( tokenAttributes .connect(collectionOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]), + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]), ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); }); it('should not allow to manage collaborators if the caller is not the issuer', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -954,13 +828,13 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes .connect(tokenOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]), + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -969,7 +843,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(collectionOwner) .manageCollaborators( - await ownedCollection.getAddress(), + collectionAddress, [tokenOwner.address, await collectionOwner.getAddress()], [true], ), @@ -981,7 +855,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, tokenOwner.address, @@ -991,7 +865,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to manage access control if the caller is not issuer', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); @@ -1000,7 +874,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, tokenOwner.address, @@ -1010,7 +884,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), true, ); @@ -1019,7 +893,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, tokenOwner.address, @@ -1029,155 +903,100 @@ describe('RMRKTokenAttributesRepository', async function () { it('should return the expected value when checking for collaborators', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); - expect( - await tokenAttributes.isCollaborator( - tokenOwner.address, - await ownedCollection.getAddress(), - ), - ).to.be.false; + expect(await tokenAttributes.isCollaborator(tokenOwner.address, collectionAddress)).to.be + .false; await tokenAttributes .connect(collectionOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]); + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]); - expect( - await tokenAttributes.isCollaborator( - tokenOwner.address, - await ownedCollection.getAddress(), - ), - ).to.be.true; + expect(await tokenAttributes.isCollaborator(tokenOwner.address, collectionAddress)).to.be + .true; }); it('should return the expected value when checking for specific addresses', async function () { await tokenAttributes.registerAccessControl( - await ownedCollection.getAddress(), + collectionAddress, await collectionOwner.getAddress(), false, ); - expect( - await tokenAttributes.isSpecificAddress( - tokenOwner.address, - await ownedCollection.getAddress(), - 'X', - ), - ).to.be.false; + expect(await tokenAttributes.isSpecificAddress(tokenOwner.address, collectionAddress, 'X')).to + .be.false; await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, tokenOwner.address, ); - expect( - await tokenAttributes.isSpecificAddress( - tokenOwner.address, - await ownedCollection.getAddress(), - 'X', - ), - ).to.be.true; + expect(await tokenAttributes.isSpecificAddress(tokenOwner.address, collectionAddress, 'X')).to + .be.true; }); it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - true, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true); await tokenAttributes .connect(collectionOwner) - .manageAccessControl( - await ownedCollection.getAddress(), - 'X', - AccessType.Issuer, - ethers.ZeroAddress, - ); + .manageAccessControl(collectionAddress, 'X', AccessType.Issuer, ethers.ZeroAddress); await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); }); it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); await tokenAttributes .connect(collectionOwner) - .manageAccessControl( - await ownedCollection.getAddress(), - 'X', - AccessType.Collaborator, - ethers.ZeroAddress, - ); + .manageAccessControl(collectionAddress, 'X', AccessType.Collaborator, ethers.ZeroAddress); await tokenAttributes .connect(collectionOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]); + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]); await tokenAttributes .connect(tokenOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); await expect( tokenAttributes .connect(collectionOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); }); it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, ethers.ZeroAddress, @@ -1185,41 +1004,32 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes .connect(collectionOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); await tokenAttributes .connect(collectionOwner) - .manageCollaborators(await ownedCollection.getAddress(), [tokenOwner.address], [true]); + .manageCollaborators(collectionAddress, [tokenOwner.address], [true]); await tokenAttributes .connect(tokenOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); }); it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - true, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true); await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.IssuerOrCollaborator, ethers.ZeroAddress, @@ -1227,90 +1037,58 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes .connect(collectionOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); await tokenAttributes .connect(collectionOwner) - .manageCollaborators( - await ownedCollection.getAddress(), - [await collaborator.getAddress()], - [true], - ); + .manageCollaborators(collectionAddress, [await collaborator.getAddress()], [true]); await tokenAttributes .connect(collaborator) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); }); it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); await tokenAttributes .connect(collectionOwner) - .manageAccessControl( - await ownedCollection.getAddress(), - 'X', - AccessType.TokenOwner, - ethers.ZeroAddress, - ); + .manageAccessControl(collectionAddress, 'X', AccessType.TokenOwner, ethers.ZeroAddress); await expect( tokenAttributes .connect(collaborator) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); await expect( tokenAttributes .connect(collectionOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotTokenOwner'); await tokenAttributes .connect(tokenOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); }); it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.SpecificAddress, ethers.ZeroAddress, @@ -1319,18 +1097,13 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes .connect(tokenOwner) - .setAddressAttribute( - await ownedCollection.getAddress(), - tokenId, - 'X', - tokenOwner.address, - ), + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), ).to.be.revertedWithCustomError(tokenAttributes, 'NotSpecificAddress'); await tokenAttributes .connect(collectionOwner) .manageAccessControl( - await ownedCollection.getAddress(), + collectionAddress, 'X', AccessType.SpecificAddress, tokenOwner.address, @@ -1338,48 +1111,44 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes .connect(tokenOwner) - .setAddressAttribute(await ownedCollection.getAddress(), tokenId, 'X', tokenOwner.address); + .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); }); it('should allow to use presigned message to modify the parameters', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, 9999999999n, ); const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', 9999999999n, ); const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, 9999999999n, ); const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', 9999999999n, ); const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1417,7 +1186,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetUintAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, @@ -1428,13 +1197,13 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), 1, 'X', 1); + .withArgs(collectionAddress, 1, 'X', 1); await expect( tokenAttributes .connect(tokenOwner) .presignedSetStringAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', @@ -1445,13 +1214,13 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), 1, 'X', 'test'); + .withArgs(collectionAddress, 1, 'X', 'test'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetBoolAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, @@ -1462,13 +1231,13 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), 1, 'X', true); + .withArgs(collectionAddress, 1, 'X', true); await expect( tokenAttributes .connect(tokenOwner) .presignedSetBytesAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', @@ -1479,13 +1248,13 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), 1, 'X', '0x1234'); + .withArgs(collectionAddress, 1, 'X', '0x1234'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetAddressAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1496,50 +1265,46 @@ describe('RMRKTokenAttributesRepository', async function () { ), ) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(await ownedCollection.getAddress(), 1, 'X', tokenOwner.address); + .withArgs(collectionAddress, 1, 'X', tokenOwner.address); }); it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); await mine(1000, { interval: 15 }); const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, 10n, ); const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', 10n, ); const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, 10n, ); const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', 10n, ); const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1577,7 +1342,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetUintAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, @@ -1592,7 +1357,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetStringAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', @@ -1607,7 +1372,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBoolAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, @@ -1622,7 +1387,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBytesAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', @@ -1637,7 +1402,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetAddressAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1652,42 +1417,38 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl( - await ownedCollection.getAddress(), - await collectionOwner.getAddress(), - false, - ); + .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, 9999999999n, ); const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', 9999999999n, ); const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, 9999999999n, ); const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', 9999999999n, ); const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1725,7 +1486,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetUintAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, @@ -1740,7 +1501,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetStringAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', @@ -1755,7 +1516,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBoolAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, @@ -1770,7 +1531,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBytesAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', @@ -1785,7 +1546,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetAddressAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1799,35 +1560,35 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to use presigned message to modify the parameters if the signer is not authorized to modify them', async function () { const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, 9999999999n, ); const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', 9999999999n, ); const boolMessage = await tokenAttributes.prepareMessageToPresignBoolAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, 9999999999n, ); const bytesMessage = await tokenAttributes.prepareMessageToPresignBytesAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', 9999999999n, ); const addressMessage = await tokenAttributes.prepareMessageToPresignAddressAttribute( - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, @@ -1865,7 +1626,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetUintAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 1, @@ -1880,7 +1641,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetStringAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', 'test', @@ -1895,7 +1656,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBoolAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', true, @@ -1910,7 +1671,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetBytesAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', '0x1234', @@ -1925,7 +1686,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(tokenOwner) .presignedSetAddressAttribute( await collectionOwner.getAddress(), - await ownedCollection.getAddress(), + collectionAddress, tokenId, 'X', tokenOwner.address, From ce9db7ef71da8458c217af00a49e6512019a2207 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Mon, 4 Mar 2024 21:00:31 -0500 Subject: [PATCH 04/15] Changes on RMRKTokenAttributes. No long uses structs as return values for batch getters. If a single attribute is sent on batch getter/setters it will use it for all collections and tokens. --- .../extension/tokenAttributes/IERC7508.sol | 40 +- .../RMRKTokenAttributesRepository.sol | 341 ++++++++++-------- .../extension/tokenAttributes/IERC7508.md | 92 ++--- .../RMRKTokenAttributesRepository.md | 114 +++--- test/extensions/tokenAttributesRepository.ts | 80 +--- test/interfaces.ts | 2 +- 6 files changed, 332 insertions(+), 337 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol index c0aa8735..d709991b 100644 --- a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol +++ b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol @@ -748,11 +748,11 @@ interface IERC7508 is IERC165 { * @param boolKeys An array of bool type attribute keys to retrieve * @param addressKeys An array of address type attribute keys to retrieve * @param bytesKeys An array of bytes type attribute keys to retrieve - * @return stringAttributes An array of `StringAttribute` structs containing the string type attributes - * @return uintAttributes An array of `UintAttribute` structs containing the uint type attributes - * @return boolAttributes An array of `BoolAttribute` structs containing the bool type attributes - * @return addressAttributes An array of `AddressAttribute` structs containing the address type attributes - * @return bytesAttributes An array of `BytesAttribute` structs containing the bytes type attributes + * @return stringAttributes An array of strings, in the same order as the stringKeys + * @return uintAttributes An array of uints, in the same order as the uintKeys + * @return boolAttributes An array of bools, in the same order as the boolKeys + * @return addressAttributes An array of addresses, in the same order as the addressKeys + * @return bytesAttributes An array of bytes, in the same order as the bytesKeys */ function getAttributes( address collection, @@ -766,11 +766,11 @@ interface IERC7508 is IERC165 { external view returns ( - StringAttribute[] memory stringAttributes, - UintAttribute[] memory uintAttributes, - BoolAttribute[] memory boolAttributes, - AddressAttribute[] memory addressAttributes, - BytesAttribute[] memory bytesAttributes + string[] memory stringAttributes, + uint256[] memory uintAttributes, + bool[] memory boolAttributes, + address[] memory addressAttributes, + bytes[] memory bytesAttributes ); /** @@ -783,13 +783,13 @@ interface IERC7508 is IERC165 { * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributeKeys An array of string keys to retrieve - * @return attributes An array of `StringAttribute` structs + * @return attributes An array of strings, in the same order as the attribute keys */ function getStringAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) external view returns (StringAttribute[] memory attributes); + ) external view returns (string[] memory attributes); /** * @notice Used to get multiple uint parameter values for a token. @@ -801,13 +801,13 @@ interface IERC7508 is IERC165 { * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributeKeys An array of uint keys to retrieve - * @return attributes An array of `UintAttribute` structs + * @return attributes An array of uints, in the same order as the attribute keys */ function getUintAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) external view returns (UintAttribute[] memory attributes); + ) external view returns (uint256[] memory attributes); /** * @notice Used to get multiple bool parameter values for a token. @@ -819,13 +819,13 @@ interface IERC7508 is IERC165 { * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributeKeys An array of bool keys to retrieve - * @return attributes An array of `BoolAttribute` structs + * @return attributes An array of bools, in the same order as the attribute keys */ function getBoolAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) external view returns (BoolAttribute[] memory attributes); + ) external view returns (bool[] memory attributes); /** * @notice Used to get multiple address parameter values for a token. @@ -837,13 +837,13 @@ interface IERC7508 is IERC165 { * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributeKeys An array of address keys to retrieve - * @return attributes An array of `AddressAttribute` structs + * @return attributes An array of addresses, in the same order as the attribute keys */ function getAddressAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) external view returns (AddressAttribute[] memory attributes); + ) external view returns (address[] memory attributes); /** * @notice Used to get multiple bytes parameter values for a token. @@ -855,11 +855,11 @@ interface IERC7508 is IERC165 { * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. * @param attributeKeys An array of bytes keys to retrieve - * @return attributes An array of `BytesAttribute` structs + * @return attributes An array of bytes, in the same order as the attribute keys */ function getBytesAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) external view returns (BytesAttribute[] memory attributes); + ) external view returns (bytes[] memory attributes); } diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index bf647086..fe3d4ab5 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -366,11 +366,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { external view returns ( - StringAttribute[] memory stringAttributes, - UintAttribute[] memory uintAttributes, - BoolAttribute[] memory boolAttributes, - AddressAttribute[] memory addressAttributes, - BytesAttribute[] memory bytesAttributes + string[] memory stringAttributes, + uint256[] memory uintAttributes, + bool[] memory boolAttributes, + address[] memory addressAttributes, + bytes[] memory bytesAttributes ) { address[] memory collections = new address[](1); @@ -400,24 +400,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (StringAttribute[] memory attributes) { - uint256 length = attributeKeys.length; + ) public view returns (string[] memory attributes) { ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); - attributes = new StringAttribute[](length); + attributes = new string[](loopLength); - for (uint256 i; i < length; ) { - attributes[i] = StringAttribute({ - key: attributeKeys[i], - value: getStringAttribute( - multipleCollections ? collections[i] : collections[0], - multipleTokens ? tokenIds[i] : tokenIds[0], - attributeKeys[i] - ) - }); + for (uint256 i; i < loopLength; ) { + attributes[i] = getStringAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); unchecked { ++i; } @@ -431,24 +433,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (UintAttribute[] memory attributes) { - uint256 length = attributeKeys.length; + ) public view returns (uint256[] memory attributes) { ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); - attributes = new UintAttribute[](length); + attributes = new uint256[](loopLength); - for (uint256 i; i < length; ) { - attributes[i] = UintAttribute({ - key: attributeKeys[i], - value: getUintAttribute( - multipleCollections ? collections[i] : collections[0], - multipleTokens ? tokenIds[i] : tokenIds[0], - attributeKeys[i] - ) - }); + for (uint256 i; i < loopLength; ) { + attributes[i] = getUintAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); unchecked { ++i; } @@ -462,24 +466,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (BoolAttribute[] memory attributes) { - uint256 length = attributeKeys.length; + ) public view returns (bool[] memory attributes) { ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); - attributes = new BoolAttribute[](length); + attributes = new bool[](loopLength); - for (uint256 i; i < length; ) { - attributes[i] = BoolAttribute({ - key: attributeKeys[i], - value: getBoolAttribute( - multipleCollections ? collections[i] : collections[0], - multipleTokens ? tokenIds[i] : tokenIds[0], - attributeKeys[i] - ) - }); + for (uint256 i; i < loopLength; ) { + attributes[i] = getBoolAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); unchecked { ++i; } @@ -493,24 +499,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (AddressAttribute[] memory attributes) { - uint256 length = attributeKeys.length; + ) public view returns (address[] memory attributes) { ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); - attributes = new AddressAttribute[](length); + attributes = new address[](loopLength); - for (uint256 i; i < length; ) { - attributes[i] = AddressAttribute({ - key: attributeKeys[i], - value: getAddressAttribute( - multipleCollections ? collections[i] : collections[0], - multipleTokens ? tokenIds[i] : tokenIds[0], - attributeKeys[i] - ) - }); + for (uint256 i; i < loopLength; ) { + attributes[i] = getAddressAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); unchecked { ++i; } @@ -524,24 +532,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (BytesAttribute[] memory attributes) { - uint256 length = attributeKeys.length; + ) public view returns (bytes[] memory attributes) { ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); - attributes = new BytesAttribute[](length); + attributes = new bytes[](loopLength); - for (uint256 i; i < length; ) { - attributes[i] = BytesAttribute({ - key: attributeKeys[i], - value: getBytesAttribute( - multipleCollections ? collections[i] : collections[0], - multipleTokens ? tokenIds[i] : tokenIds[0], - attributeKeys[i] - ) - }); + for (uint256 i; i < loopLength; ) { + attributes[i] = getBytesAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); unchecked { ++i; } @@ -731,22 +741,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { uint256[] memory tokenIds, BoolAttribute[] memory attributes ) external { - uint256 length = attributes.length; ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i = 0; i < length; ) { - address collection = multipleCollections - ? collections[i] - : collections[0]; - uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + BoolAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; _setBoolAttribute( _msgSender(), - collection, - tokenId, - attributes[i].key, - attributes[i].value + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value ); unchecked { ++i; @@ -762,22 +776,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { uint256[] memory tokenIds, BytesAttribute[] memory attributes ) external { - uint256 length = attributes.length; ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i = 0; i < length; ) { - address collection = multipleCollections - ? collections[i] - : collections[0]; - uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + BytesAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; _setBytesAttribute( _msgSender(), - collection, - tokenId, - attributes[i].key, - attributes[i].value + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value ); unchecked { ++i; @@ -793,22 +811,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { uint256[] memory tokenIds, StringAttribute[] memory attributes ) external { - uint256 length = attributes.length; ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i = 0; i < length; ) { - address collection = multipleCollections - ? collections[i] - : collections[0]; - uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + StringAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; _setStringAttribute( _msgSender(), - collection, - tokenId, - attributes[i].key, - attributes[i].value + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value ); unchecked { ++i; @@ -824,22 +846,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { uint256[] memory tokenIds, UintAttribute[] memory attributes ) external { - uint256 length = attributes.length; ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i = 0; i < length; ) { - address collection = multipleCollections - ? collections[i] - : collections[0]; - uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + UintAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; _setUintAttribute( _msgSender(), - collection, - tokenId, - attributes[i].key, - attributes[i].value + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value ); unchecked { ++i; @@ -855,22 +881,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { uint256[] memory tokenIds, AddressAttribute[] memory attributes ) external { - uint256 length = attributes.length; ( bool multipleCollections, - bool multipleTokens - ) = _checkIfMultipleCollectionsAndTokens(collections, tokenIds, length); - for (uint256 i = 0; i < length; ) { - address collection = multipleCollections - ? collections[i] - : collections[0]; - uint256 tokenId = multipleTokens ? tokenIds[i] : tokenIds[0]; + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + AddressAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; _setAddressAttribute( _msgSender(), - collection, - tokenId, - attributes[i].key, - attributes[i].value + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value ); unchecked { ++i; @@ -891,7 +921,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { BytesAttribute[] memory bytesAttributes ) external { uint256 length = stringAttributes.length; - for (uint256 i = 0; i < length; ) { + for (uint256 i; i < length; ) { _setStringAttribute( _msgSender(), collection, @@ -905,7 +935,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } length = uintAttributes.length; - for (uint256 i = 0; i < length; ) { + for (uint256 i; i < length; ) { _setUintAttribute( _msgSender(), collection, @@ -919,7 +949,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } length = boolAttributes.length; - for (uint256 i = 0; i < length; ) { + for (uint256 i; i < length; ) { _setBoolAttribute( _msgSender(), collection, @@ -933,7 +963,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } length = addressAttributes.length; - for (uint256 i = 0; i < length; ) { + for (uint256 i; i < length; ) { _setAddressAttribute( _msgSender(), collection, @@ -947,7 +977,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } length = bytesAttributes.length; - for (uint256 i = 0; i < length; ) { + for (uint256 i; i < length; ) { _setBytesAttribute( _msgSender(), collection, @@ -965,15 +995,40 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address[] memory collections, uint256[] memory tokenIds, uint256 attributesLength - ) internal pure returns (bool multipleCollections, bool multipleTokens) { + ) + internal + pure + returns ( + bool multipleCollections, + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) + { multipleCollections = collections.length != 1; multipleTokens = tokenIds.length != 1; + multipleAttributes = attributesLength != 1; if ( - (multipleCollections && collections.length != attributesLength) || - (multipleTokens && tokenIds.length != attributesLength) + (multipleCollections && + multipleAttributes && + collections.length != attributesLength) || + (multipleTokens && + multipleAttributes && + tokenIds.length != attributesLength) || + (multipleCollections && + multipleTokens && + collections.length != tokenIds.length) ) { revert LengthsMismatch(); } + + if (multipleCollections) { + loopLength = collections.length; + } else if (multipleTokens) { + loopLength = tokenIds.length; + } else { + loopLength = attributesLength; + } } function _setBoolAttribute( diff --git a/docs/RMRK/extension/tokenAttributes/IERC7508.md b/docs/RMRK/extension/tokenAttributes/IERC7508.md index 32f8100e..df3e0435 100644 --- a/docs/RMRK/extension/tokenAttributes/IERC7508.md +++ b/docs/RMRK/extension/tokenAttributes/IERC7508.md @@ -37,7 +37,7 @@ Used to retrieve the address type token attributes. ### getAddressAttributes ```solidity -function getAddressAttributes(address collection, uint256 tokenId, string[] addressKeys) external view returns (struct IERC7508.AddressAttribute[] attributes) +function getAddressAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (address[] attributes) ``` Used to get multiple address parameter values for a token. @@ -48,20 +48,20 @@ Used to get multiple address parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| addressKeys | string[] | An array of address keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of address keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.AddressAttribute[] | An array of `AddressAttribute` structs | +| attributes | address[] | An array of addresses, in the same order as the attribute keys | ### getAttributes ```solidity -function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (struct IERC7508.StringAttribute[] stringAttributes, struct IERC7508.UintAttribute[] uintAttributes, struct IERC7508.BoolAttribute[] boolAttributes, struct IERC7508.AddressAttribute[] addressAttributes, struct IERC7508.BytesAttribute[] bytesAttributes) +function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (string[] stringAttributes, uint256[] uintAttributes, bool[] boolAttributes, address[] addressAttributes, bytes[] bytesAttributes) ``` Used to retrieve multiple token attributes of any type at once. @@ -84,11 +84,11 @@ Used to retrieve multiple token attributes of any type at once. | Name | Type | Description | |---|---|---| -| stringAttributes | IERC7508.StringAttribute[] | An array of `StringAttribute` structs containing the string type attributes | -| uintAttributes | IERC7508.UintAttribute[] | An array of `UintAttribute` structs containing the uint type attributes | -| boolAttributes | IERC7508.BoolAttribute[] | An array of `BoolAttribute` structs containing the bool type attributes | -| addressAttributes | IERC7508.AddressAttribute[] | An array of `AddressAttribute` structs containing the address type attributes | -| bytesAttributes | IERC7508.BytesAttribute[] | An array of `BytesAttribute` structs containing the bytes type attributes | +| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | +| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | +| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | +| addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | +| bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | ### getBoolAttribute @@ -117,7 +117,7 @@ Used to retrieve the bool type token attributes. ### getBoolAttributes ```solidity -function getBoolAttributes(address collection, uint256 tokenId, string[] boolKeys) external view returns (struct IERC7508.BoolAttribute[] attributes) +function getBoolAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (bool[] attributes) ``` Used to get multiple bool parameter values for a token. @@ -128,15 +128,15 @@ Used to get multiple bool parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| boolKeys | string[] | An array of bool keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of bool keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.BoolAttribute[] | An array of `BoolAttribute` structs | +| attributes | bool[] | An array of bools, in the same order as the attribute keys | ### getBytesAttribute @@ -165,7 +165,7 @@ Used to retrieve the bytes type token attributes. ### getBytesAttributes ```solidity -function getBytesAttributes(address collection, uint256 tokenId, string[] bytesKeys) external view returns (struct IERC7508.BytesAttribute[] attributes) +function getBytesAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (bytes[] attributes) ``` Used to get multiple bytes parameter values for a token. @@ -176,15 +176,15 @@ Used to get multiple bytes parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| bytesKeys | string[] | An array of bytes keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of bytes keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.BytesAttribute[] | An array of `BytesAttribute` structs | +| attributes | bytes[] | An array of bytes, in the same order as the attribute keys | ### getStringAttribute @@ -213,7 +213,7 @@ Used to retrieve the string type token attributes. ### getStringAttributes ```solidity -function getStringAttributes(address collection, uint256 tokenId, string[] stringKeys) external view returns (struct IERC7508.StringAttribute[] attributes) +function getStringAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (string[] attributes) ``` Used to get multiple sting parameter values for a token. @@ -224,15 +224,15 @@ Used to get multiple sting parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| stringKeys | string[] | An array of string keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of string keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.StringAttribute[] | An array of `StringAttribute` structs | +| attributes | string[] | An array of strings, in the same order as the attribute keys | ### getUintAttribute @@ -261,7 +261,7 @@ Used to retrieve the uint type token attributes. ### getUintAttributes ```solidity -function getUintAttributes(address collection, uint256 tokenId, string[] uintKeys) external view returns (struct IERC7508.UintAttribute[] attributes) +function getUintAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (uint256[] attributes) ``` Used to get multiple uint parameter values for a token. @@ -272,15 +272,15 @@ Used to get multiple uint parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| uintKeys | string[] | An array of uint keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of uint keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.UintAttribute[] | An array of `UintAttribute` structs | +| attributes | uint256[] | An array of uints, in the same order as the attribute keys | ### isCollaborator @@ -656,7 +656,7 @@ Used to set an address attribute. ### setAddressAttributes ```solidity -function setAddressAttributes(address collection, uint256 tokenId, IERC7508.AddressAttribute[] attributes) external nonpayable +function setAddressAttributes(address[] collections, uint256[] tokenIds, IERC7508.AddressAttribute[] attributes) external nonpayable ``` @@ -667,8 +667,8 @@ function setAddressAttributes(address collection, uint256 tokenId, IERC7508.Addr | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.AddressAttribute[] | undefined | ### setAttributes @@ -715,7 +715,7 @@ Used to set a boolean attribute. ### setBoolAttributes ```solidity -function setBoolAttributes(address collection, uint256 tokenId, IERC7508.BoolAttribute[] attributes) external nonpayable +function setBoolAttributes(address[] collections, uint256[] tokenIds, IERC7508.BoolAttribute[] attributes) external nonpayable ``` @@ -726,8 +726,8 @@ function setBoolAttributes(address collection, uint256 tokenId, IERC7508.BoolAtt | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.BoolAttribute[] | undefined | ### setBytesAttribute @@ -752,7 +752,7 @@ Used to set an bytes attribute. ### setBytesAttributes ```solidity -function setBytesAttributes(address collection, uint256 tokenId, IERC7508.BytesAttribute[] attributes) external nonpayable +function setBytesAttributes(address[] collections, uint256[] tokenIds, IERC7508.BytesAttribute[] attributes) external nonpayable ``` @@ -763,8 +763,8 @@ function setBytesAttributes(address collection, uint256 tokenId, IERC7508.BytesA | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.BytesAttribute[] | undefined | ### setStringAttribute @@ -789,7 +789,7 @@ Used to set a string attribute. ### setStringAttributes ```solidity -function setStringAttributes(address collection, uint256 tokenId, IERC7508.StringAttribute[] attributes) external nonpayable +function setStringAttributes(address[] collections, uint256[] tokenIds, IERC7508.StringAttribute[] attributes) external nonpayable ``` @@ -800,8 +800,8 @@ function setStringAttributes(address collection, uint256 tokenId, IERC7508.Strin | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.StringAttribute[] | undefined | ### setUintAttribute @@ -826,7 +826,7 @@ Used to set a number attribute. ### setUintAttributes ```solidity -function setUintAttributes(address collection, uint256 tokenId, IERC7508.UintAttribute[] attributes) external nonpayable +function setUintAttributes(address[] collections, uint256[] tokenIds, IERC7508.UintAttribute[] attributes) external nonpayable ``` @@ -837,8 +837,8 @@ function setUintAttributes(address collection, uint256 tokenId, IERC7508.UintAtt | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.UintAttribute[] | undefined | ### supportsInterface diff --git a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md index 2b05a4d1..884f3cac 100644 --- a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md +++ b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md @@ -139,7 +139,7 @@ Used to retrieve the address type token attributes. ### getAddressAttributes ```solidity -function getAddressAttributes(address collection, uint256 tokenId, string[] addressKeys) external view returns (struct IERC7508.AddressAttribute[] attributes) +function getAddressAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (address[] attributes) ``` Used to get multiple address parameter values for a token. @@ -150,20 +150,20 @@ Used to get multiple address parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| addressKeys | string[] | An array of address keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of address keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.AddressAttribute[] | An array of `AddressAttribute` structs | +| attributes | address[] | An array of addresses, in the same order as the attribute keys | ### getAttributes ```solidity -function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (struct IERC7508.StringAttribute[] stringAttributes, struct IERC7508.UintAttribute[] uintAttributes, struct IERC7508.BoolAttribute[] boolAttributes, struct IERC7508.AddressAttribute[] addressAttributes, struct IERC7508.BytesAttribute[] bytesAttributes) +function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (string[] stringAttributes, uint256[] uintAttributes, bool[] boolAttributes, address[] addressAttributes, bytes[] bytesAttributes) ``` Used to retrieve multiple token attributes of any type at once. @@ -186,11 +186,11 @@ Used to retrieve multiple token attributes of any type at once. | Name | Type | Description | |---|---|---| -| stringAttributes | IERC7508.StringAttribute[] | An array of `StringAttribute` structs containing the string type attributes | -| uintAttributes | IERC7508.UintAttribute[] | An array of `UintAttribute` structs containing the uint type attributes | -| boolAttributes | IERC7508.BoolAttribute[] | An array of `BoolAttribute` structs containing the bool type attributes | -| addressAttributes | IERC7508.AddressAttribute[] | An array of `AddressAttribute` structs containing the address type attributes | -| bytesAttributes | IERC7508.BytesAttribute[] | An array of `BytesAttribute` structs containing the bytes type attributes | +| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | +| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | +| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | +| addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | +| bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | ### getBoolAttribute @@ -219,7 +219,7 @@ Used to retrieve the bool type token attributes. ### getBoolAttributes ```solidity -function getBoolAttributes(address collection, uint256 tokenId, string[] boolKeys) external view returns (struct IERC7508.BoolAttribute[] attributes) +function getBoolAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (bool[] attributes) ``` Used to get multiple bool parameter values for a token. @@ -230,15 +230,15 @@ Used to get multiple bool parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| boolKeys | string[] | An array of bool keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of bool keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.BoolAttribute[] | An array of `BoolAttribute` structs | +| attributes | bool[] | An array of bools, in the same order as the attribute keys | ### getBytesAttribute @@ -267,7 +267,7 @@ Used to retrieve the bytes type token attributes. ### getBytesAttributes ```solidity -function getBytesAttributes(address collection, uint256 tokenId, string[] bytesKeys) external view returns (struct IERC7508.BytesAttribute[] attributes) +function getBytesAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (bytes[] attributes) ``` Used to get multiple bytes parameter values for a token. @@ -278,15 +278,15 @@ Used to get multiple bytes parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| bytesKeys | string[] | An array of bytes keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of bytes keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.BytesAttribute[] | An array of `BytesAttribute` structs | +| attributes | bytes[] | An array of bytes, in the same order as the attribute keys | ### getStringAttribute @@ -315,7 +315,7 @@ Used to retrieve the string type token attributes. ### getStringAttributes ```solidity -function getStringAttributes(address collection, uint256 tokenId, string[] stringKeys) external view returns (struct IERC7508.StringAttribute[] attributes) +function getStringAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (string[] attributes) ``` Used to get multiple sting parameter values for a token. @@ -326,15 +326,15 @@ Used to get multiple sting parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| stringKeys | string[] | An array of string keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of string keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.StringAttribute[] | An array of `StringAttribute` structs | +| attributes | string[] | An array of strings, in the same order as the attribute keys | ### getUintAttribute @@ -363,7 +363,7 @@ Used to retrieve the uint type token attributes. ### getUintAttributes ```solidity -function getUintAttributes(address collection, uint256 tokenId, string[] uintKeys) external view returns (struct IERC7508.UintAttribute[] attributes) +function getUintAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (uint256[] attributes) ``` Used to get multiple uint parameter values for a token. @@ -374,15 +374,15 @@ Used to get multiple uint parameter values for a token. | Name | Type | Description | |---|---|---| -| collection | address | Address of the collection the token belongs to | -| tokenId | uint256 | ID of the token for which the attributes are being retrieved | -| uintKeys | string[] | An array of uint keys to retrieve | +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of uint keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| attributes | IERC7508.UintAttribute[] | An array of `UintAttribute` structs | +| attributes | uint256[] | An array of uints, in the same order as the attribute keys | ### isCollaborator @@ -758,7 +758,7 @@ Used to set an address attribute. ### setAddressAttributes ```solidity -function setAddressAttributes(address collection, uint256 tokenId, IERC7508.AddressAttribute[] attributes) external nonpayable +function setAddressAttributes(address[] collections, uint256[] tokenIds, IERC7508.AddressAttribute[] attributes) external nonpayable ``` @@ -769,8 +769,8 @@ function setAddressAttributes(address collection, uint256 tokenId, IERC7508.Addr | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.AddressAttribute[] | undefined | ### setAttributes @@ -817,7 +817,7 @@ Used to set a boolean attribute. ### setBoolAttributes ```solidity -function setBoolAttributes(address collection, uint256 tokenId, IERC7508.BoolAttribute[] attributes) external nonpayable +function setBoolAttributes(address[] collections, uint256[] tokenIds, IERC7508.BoolAttribute[] attributes) external nonpayable ``` @@ -828,8 +828,8 @@ function setBoolAttributes(address collection, uint256 tokenId, IERC7508.BoolAtt | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.BoolAttribute[] | undefined | ### setBytesAttribute @@ -854,7 +854,7 @@ Used to set an bytes attribute. ### setBytesAttributes ```solidity -function setBytesAttributes(address collection, uint256 tokenId, IERC7508.BytesAttribute[] attributes) external nonpayable +function setBytesAttributes(address[] collections, uint256[] tokenIds, IERC7508.BytesAttribute[] attributes) external nonpayable ``` @@ -865,8 +865,8 @@ function setBytesAttributes(address collection, uint256 tokenId, IERC7508.BytesA | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.BytesAttribute[] | undefined | ### setStringAttribute @@ -891,7 +891,7 @@ Used to set a string attribute. ### setStringAttributes ```solidity -function setStringAttributes(address collection, uint256 tokenId, IERC7508.StringAttribute[] attributes) external nonpayable +function setStringAttributes(address[] collections, uint256[] tokenIds, IERC7508.StringAttribute[] attributes) external nonpayable ``` @@ -902,8 +902,8 @@ function setStringAttributes(address collection, uint256 tokenId, IERC7508.Strin | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.StringAttribute[] | undefined | ### setUintAttribute @@ -928,7 +928,7 @@ Used to set a number attribute. ### setUintAttributes ```solidity -function setUintAttributes(address collection, uint256 tokenId, IERC7508.UintAttribute[] attributes) external nonpayable +function setUintAttributes(address[] collections, uint256[] tokenIds, IERC7508.UintAttribute[] attributes) external nonpayable ``` @@ -939,8 +939,8 @@ function setUintAttributes(address collection, uint256 tokenId, IERC7508.UintAtt | Name | Type | Description | |---|---|---| -| collection | address | undefined | -| tokenId | uint256 | undefined | +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | | attributes | IERC7508.UintAttribute[] | undefined | ### supportsInterface @@ -1135,17 +1135,6 @@ Used to signal that the collaborator and collaborator rights array are not of eq -### CollectionAlreadyRegistered - -```solidity -error CollectionAlreadyRegistered() -``` - -Used to signal that the collection is already registered in the repository. - - - - ### CollectionNotRegistered ```solidity @@ -1179,6 +1168,17 @@ Used to signal that the presigned message's signature is invalid. +### LengthsMismatch + +```solidity +error LengthsMismatch() +``` + +Used to signal that the length of the arrays is not equal. + + + + ### NotCollectionCollaborator ```solidity diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 76f89c74..53c7c4d9 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -437,26 +437,11 @@ describe('RMRKTokenAttributesRepository', async function () { ['bytes1', 'bytes2'], ), ).to.eql([ - [ - ['string1', 'value1'], - ['string2', 'value2'], - ], - [ - ['uint1', 1n], - ['uint2', 2n], - ], - [ - ['bool1', true], - ['bool2', false], - ], - [ - ['address1', tokenOwner.address], - ['address2', await collectionOwner.getAddress()], - ], - [ - ['bytes1', '0x1234'], - ['bytes2', '0x5678'], - ], + ['value1', 'value2'], + [1n, 2n], + [true, false], + [tokenOwner.address, await collectionOwner.getAddress()], + ['0x1234', '0x5678'], ]); }); @@ -486,16 +471,7 @@ describe('RMRKTokenAttributesRepository', async function () { [], [], ), - ).to.eql([ - [ - ['string1', 'value1'], - ['string2', 'value2'], - ], - [], - [], - [], - [], - ]); + ).to.eql([['value1', 'value2'], [], [], [], []]); }); it('can set multiple uint attributes at the same time', async function () { @@ -524,16 +500,7 @@ describe('RMRKTokenAttributesRepository', async function () { [], [], ), - ).to.eql([ - [], - [ - ['uint1', 1n], - ['uint2', 2n], - ], - [], - [], - [], - ]); + ).to.eql([[], [1n, 2n], [], [], []]); }); it('can set multiple bool attributes at the same time', async function () { @@ -562,16 +529,7 @@ describe('RMRKTokenAttributesRepository', async function () { [], [], ), - ).to.eql([ - [], - [], - [ - ['bool1', true], - ['bool2', false], - ], - [], - [], - ]); + ).to.eql([[], [], [true, false], [], []]); }); it('can set multiple address attributes at the same time', async function () { @@ -600,16 +558,7 @@ describe('RMRKTokenAttributesRepository', async function () { ['address1', 'address2'], [], ), - ).to.eql([ - [], - [], - [], - [ - ['address1', tokenOwner.address], - ['address2', await collectionOwner.getAddress()], - ], - [], - ]); + ).to.eql([[], [], [], [tokenOwner.address, await collectionOwner.getAddress()], []]); }); it('can set multiple bytes attributes at the same time', async function () { @@ -638,16 +587,7 @@ describe('RMRKTokenAttributesRepository', async function () { [], ['bytes1', 'bytes2'], ), - ).to.eql([ - [], - [], - [], - [], - [ - ['bytes1', '0x1234'], - ['bytes2', '0x5678'], - ], - ]); + ).to.eql([[], [], [], [], ['0x1234', '0x5678']]); }); it('can reuse keys and values are fine', async function () { diff --git a/test/interfaces.ts b/test/interfaces.ts index 1db845b6..dd0aaf6e 100644 --- a/test/interfaces.ts +++ b/test/interfaces.ts @@ -7,7 +7,7 @@ export const IERC6220 = '0x28bc9ae4'; // Equippable and Composable export const IERC6454 = '0x91a6262f'; // Soulbound export const IERC7401 = '0x42b0e56f'; // Nestable export const IERC7409 = '0x1b3327ab'; // Emotes Repository -export const IERC7508 = '0x29b20880'; // Attributes Repository +export const IERC7508 = '0x9f89917b'; // Attributes Repository export const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder export const IOtherInterface = '0xffffffff'; export const IRMRKCatalog = '0xd912401f'; // ERC6220 From 7c9d05d11852f22cd863096a684f7a2a71151683 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Tue, 5 Mar 2024 15:27:42 -0500 Subject: [PATCH 05/15] Adds methods to get and set attributes metadata for a collection. --- .../extension/tokenAttributes/IERC7508.sol | 30 ++++++++++ .../RMRKTokenAttributesRepository.sol | 41 +++++++++++--- .../extension/tokenAttributes/IERC7508.md | 56 +++++++++++++++++++ .../RMRKTokenAttributesRepository.md | 56 +++++++++++++++++++ test/interfaces.ts | 2 +- 5 files changed, 175 insertions(+), 10 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol index d709991b..dc0dcc12 100644 --- a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol +++ b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol @@ -105,6 +105,16 @@ interface IERC7508 is IERC165 { address specificAddress ); + /** + * @notice Used to notify listeners that the metadata URI for a collection has been updated. + * @param collection Address of the collection + * @param attributesMetadataURI The new attributes metadata URI + */ + event MetadataURIUpdated( + address indexed collection, + string attributesMetadataURI + ); + /** * @notice Used to notify listeners that a new collaborator has been added or removed. * @param collection Address of the collection @@ -244,6 +254,26 @@ interface IERC7508 is IERC165 { bool[] memory collaboratorAddressAccess ) external; + /** + * @notice Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. + * @param collection Address of the collection + * @return attributesMetadataURI The URI of the attributes metadata + */ + function getAttributesMetadataURI( + address collection + ) external view returns (string memory attributesMetadataURI); + + /** + * @notice Used to set the metadata URI for a collection, which contains all the information about the collection attributes. + * @dev Emits a {MetadataURIUpdated} event. + * @param collection Address of the collection + * @param attributesMetadataURI The URI of the attributes metadata + */ + function setAttributesMetadataURI( + address collection, + string memory attributesMetadataURI + ) external; + /** * @notice Used to set a number attribute. * @dev Emits a {UintAttributeUpdated} event. diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index fe3d4ab5..f1711765 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -44,19 +44,22 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { "setAddressAttribute(address collection,uint256 tokenId,string memory key,address value)" ); - mapping(address collection => mapping(uint256 => AccessType)) + mapping(address collection => mapping(uint256 parameterId => AccessType accessType)) private _parameterAccessType; - mapping(address collection => mapping(uint256 => address)) + mapping(address collection => mapping(uint256 parameterId => address specificAddress)) private _parameterSpecificAddress; - mapping(address collection => IssuerSetting) private _issuerSettings; - mapping(address collection => mapping(address collaborator => bool)) + mapping(address collection => IssuerSetting setting) + private _issuerSettings; + mapping(address collection => mapping(address collaborator => bool isCollaborator)) private _collaborators; // For keys, we use a mapping from strings to IDs. // The purpose is to store unique string keys only once, since they are more expensive. - mapping(string => uint256) private _keysToIds; - uint256 private _totalAttributes; + mapping(string key => uint256 id) private _keysToIds; + uint256 private _nextKeyId; + mapping(address collection => string attributesMetadataURI) + private _attributesMetadataURIs; mapping(address collection => mapping(uint256 => mapping(uint256 => address))) private _addressValues; mapping(address collection => mapping(uint256 => mapping(uint256 => bytes))) @@ -177,6 +180,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + /** + * @inheritdoc IERC7508 + */ + function getAttributesMetadataURI( + address collection + ) external view returns (string memory attributesMetadataURI) { + attributesMetadataURI = _attributesMetadataURIs[collection]; + } + + /** + * @inheritdoc IERC7508 + */ + function setAttributesMetadataURI( + address collection, + string memory attributesMetadataURI + ) external onlyIssuer(collection) { + _attributesMetadataURIs[collection] = attributesMetadataURI; + emit MetadataURIUpdated(collection, attributesMetadataURI); + } + /** * @inheritdoc IERC7508 */ @@ -1287,9 +1310,9 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { */ function _getIdForKey(string memory key) internal returns (uint256 keyID) { if (_keysToIds[key] == 0) { - _totalAttributes++; - _keysToIds[key] = _totalAttributes; - keyID = _totalAttributes; + _nextKeyId++; + _keysToIds[key] = _nextKeyId; + keyID = _nextKeyId; } else { keyID = _keysToIds[key]; } diff --git a/docs/RMRK/extension/tokenAttributes/IERC7508.md b/docs/RMRK/extension/tokenAttributes/IERC7508.md index df3e0435..28ee97a7 100644 --- a/docs/RMRK/extension/tokenAttributes/IERC7508.md +++ b/docs/RMRK/extension/tokenAttributes/IERC7508.md @@ -90,6 +90,28 @@ Used to retrieve multiple token attributes of any type at once. | addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | | bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | +### getAttributesMetadataURI + +```solidity +function getAttributesMetadataURI(address collection) external view returns (string attributesMetadataURI) +``` + +Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attributesMetadataURI | string | The URI of the attributes metadata | + ### getBoolAttribute ```solidity @@ -693,6 +715,23 @@ function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttri | addressAttributes | IERC7508.AddressAttribute[] | undefined | | bytesAttributes | IERC7508.BytesAttribute[] | undefined | +### setAttributesMetadataURI + +```solidity +function setAttributesMetadataURI(address collection, string attributesMetadataURI) external nonpayable +``` + +Used to set the metadata URI for a collection, which contains all the information about the collection attributes. + +*Emits a {MetadataURIUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection | +| attributesMetadataURI | string | The URI of the attributes metadata | + ### setBoolAttribute ```solidity @@ -980,6 +1019,23 @@ Used to notify listeners that a new collaborator has been added or removed. | collaborator `indexed` | address | Address of the collaborator | | isCollaborator | bool | A boolean value indicating whether the collaborator has been added (`true`) or removed (`false`) | +### MetadataURIUpdated + +```solidity +event MetadataURIUpdated(address indexed collection, string attributesMetadataURI) +``` + +Used to notify listeners that the metadata URI for a collection has been updated. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection `indexed` | address | Address of the collection | +| attributesMetadataURI | string | The new attributes metadata URI | + ### StringAttributeUpdated ```solidity diff --git a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md index 884f3cac..352f69a3 100644 --- a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md +++ b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md @@ -192,6 +192,28 @@ Used to retrieve multiple token attributes of any type at once. | addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | | bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | +### getAttributesMetadataURI + +```solidity +function getAttributesMetadataURI(address collection) external view returns (string attributesMetadataURI) +``` + +Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attributesMetadataURI | string | The URI of the attributes metadata | + ### getBoolAttribute ```solidity @@ -795,6 +817,23 @@ function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttri | addressAttributes | IERC7508.AddressAttribute[] | undefined | | bytesAttributes | IERC7508.BytesAttribute[] | undefined | +### setAttributesMetadataURI + +```solidity +function setAttributesMetadataURI(address collection, string attributesMetadataURI) external nonpayable +``` + +Used to set the metadata URI for a collection, which contains all the information about the collection attributes. + +*Emits a {MetadataURIUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection | +| attributesMetadataURI | string | The URI of the attributes metadata | + ### setBoolAttribute ```solidity @@ -1082,6 +1121,23 @@ Used to notify listeners that a new collaborator has been added or removed. | collaborator `indexed` | address | Address of the collaborator | | isCollaborator | bool | A boolean value indicating whether the collaborator has been added (`true`) or removed (`false`) | +### MetadataURIUpdated + +```solidity +event MetadataURIUpdated(address indexed collection, string attributesMetadataURI) +``` + +Used to notify listeners that the metadata URI for a collection has been updated. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection `indexed` | address | Address of the collection | +| attributesMetadataURI | string | The new attributes metadata URI | + ### StringAttributeUpdated ```solidity diff --git a/test/interfaces.ts b/test/interfaces.ts index dd0aaf6e..aab29664 100644 --- a/test/interfaces.ts +++ b/test/interfaces.ts @@ -7,7 +7,7 @@ export const IERC6220 = '0x28bc9ae4'; // Equippable and Composable export const IERC6454 = '0x91a6262f'; // Soulbound export const IERC7401 = '0x42b0e56f'; // Nestable export const IERC7409 = '0x1b3327ab'; // Emotes Repository -export const IERC7508 = '0x9f89917b'; // Attributes Repository +export const IERC7508 = '0x62ee8e7a'; // Attributes Repository export const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder export const IOtherInterface = '0xffffffff'; export const IRMRKCatalog = '0xd912401f'; // ERC6220 From b00fd303f2494ff2cbe681d95b22302dd087cce0 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 8 Mar 2024 09:13:45 -0500 Subject: [PATCH 06/15] Bumps version to 2.5.2. --- CHANGELOG.md | 17 +++++++++++++++++ contracts/RMRK/core/RMRKCore.sol | 2 +- package.json | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d23325..c9e72100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [2.5.2] - 2024-03-08 + +### Changed + + - Token Attributes: Refactor on token attributes to reuse code and allow multiple collections and tokenIds on setters and getters. + - Token Attributes: No long uses structs as return values for batch getters. + - Token Attributes: Batch setters and getters can now receive multiple collections and tokenIds. + - Token Attributes: If a single collection, tokenId or attribute is sent on batch getter/setters it will use it for all. + - Token Attributes: Improved readability and consistency in function signatures + +## [2.5.1] - 2024-03-02 + +### Changed + + - RMRKTokenHolder (IERC7590-Draft Implementation) now reverts if transferred ERC-20 balance is not the specified amount. + - Improves @dev comment on IERC7401, directOwnerOf method. + ## [2.5.0] - 2024-03-01 ### Added diff --git a/contracts/RMRK/core/RMRKCore.sol b/contracts/RMRK/core/RMRKCore.sol index 73b928b8..c3f2307a 100644 --- a/contracts/RMRK/core/RMRKCore.sol +++ b/contracts/RMRK/core/RMRKCore.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.21; * @dev This is currently just a passthrough contract which allows for granular editing of base-level ERC721 functions. */ contract RMRKCore { - string private constant _VERSION = "2.5.1"; + string private constant _VERSION = "2.5.2"; bytes4 private constant _RMRK_INTERFACE = 0x524D524B; // "RMRK" in ASCII hex /** diff --git a/package.json b/package.json index eaa433ab..ec978b2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rmrk-team/evm-contracts", - "version": "2.5.1", + "version": "2.5.2", "license": "Apache-2.0", "files": [ "contracts/RMRK/*", From a5641f4643deae14eb0e9f38bda61756f19e5c89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:16:38 +0000 Subject: [PATCH 07/15] Bump squirrelly from 8.0.8 to 9.0.0 Bumps [squirrelly](https://github.com/squirrellyjs/squirrelly) from 8.0.8 to 9.0.0. - [Release notes](https://github.com/squirrellyjs/squirrelly/releases) - [Commits](https://github.com/squirrellyjs/squirrelly/compare/v8.0.8...v9.0.0) --- updated-dependencies: - dependency-name: squirrelly dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 5300 +++++++++++++++--------------------------------- 2 files changed, 1592 insertions(+), 3710 deletions(-) diff --git a/package.json b/package.json index ec978b2f..48b22108 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "rimraf": "^5.0.5", "solc": "0.8.21", "solidity-coverage": "0.8.6-sha1.0", - "squirrelly": "^8.0.8", + "squirrelly": "^9.0.0", "ts-node": "11.0.0-beta.1", "typechain": "^8.3.2", "typescript": "^5.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33aafb44..891a95a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,50 +1,52 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false +dependencies: + '@openzeppelin/contracts': + specifier: ^5.0.2 + version: 5.0.2 + devDependencies: - "@nomicfoundation/hardhat-chai-matchers": + '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.3 version: 2.0.3(@nomicfoundation/hardhat-ethers@3.0.5)(chai@4.4.1)(ethers@6.10.0)(hardhat@2.19.4) - "@nomicfoundation/hardhat-ethers": + '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 version: 3.0.5(ethers@6.10.0)(hardhat@2.19.4) - "@nomicfoundation/hardhat-network-helpers": + '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.10 version: 1.0.10(hardhat@2.19.4) - "@nomicfoundation/hardhat-toolbox": + '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.3)(@nomicfoundation/hardhat-ethers@3.0.5)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.3)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.11)(@types/mocha@10.0.6)(@types/node@20.11.7)(chai@4.4.1)(ethers@6.10.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.19.4)(solidity-coverage@0.8.6-sha1.0)(ts-node@11.0.0-beta.1)(typechain@8.3.2)(typescript@5.3.3) - "@nomicfoundation/hardhat-verify": + '@nomicfoundation/hardhat-verify': specifier: ^2.0.3 version: 2.0.3(hardhat@2.19.4) - "@openzeppelin/contracts": - specifier: ^5.0.1 - version: 5.0.1 - "@primitivefi/hardhat-dodoc": + '@primitivefi/hardhat-dodoc': specifier: ^0.2.3 - version: 0.2.3(hardhat@2.19.4)(squirrelly@8.0.8) - "@typechain/ethers-v6": + version: 0.2.3(hardhat@2.19.4)(squirrelly@9.0.0) + '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3) - "@typechain/hardhat": + '@typechain/hardhat': specifier: ^9.1.0 version: 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.10.0)(hardhat@2.19.4)(typechain@8.3.2) - "@types/chai": + '@types/chai': specifier: ^4.3.11 version: 4.3.11 - "@types/mocha": + '@types/mocha': specifier: ^10.0.6 version: 10.0.6 - "@types/node": + '@types/node': specifier: ^20.11.7 version: 20.11.7 - "@typescript-eslint/eslint-plugin": + '@typescript-eslint/eslint-plugin': specifier: ^6.19.1 version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/parser": + '@typescript-eslint/parser': specifier: ^6.19.1 version: 6.19.1(eslint@8.56.0)(typescript@5.3.3) chai: @@ -105,8 +107,8 @@ devDependencies: specifier: 0.8.6-sha1.0 version: 0.8.6-sha1.0(hardhat@2.19.4) squirrelly: - specifier: ^8.0.8 - version: 8.0.8 + specifier: ^9.0.0 + version: 9.0.0 ts-node: specifier: 11.0.0-beta.1 version: 11.0.0-beta.1(@types/node@20.11.7)(typescript@5.3.3) @@ -121,93 +123,64 @@ devDependencies: version: 3.0.0 packages: + /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} dev: true /@adraffy/ens-normalize@1.10.0: - resolution: - { - integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==, - } + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} dev: true /@chainsafe/as-sha256@0.3.1: - resolution: - { - integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==, - } + resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} dev: true /@chainsafe/persistent-merkle-tree@0.4.2: - resolution: - { - integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==, - } + resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} dependencies: - "@chainsafe/as-sha256": 0.3.1 + '@chainsafe/as-sha256': 0.3.1 dev: true /@chainsafe/persistent-merkle-tree@0.5.0: - resolution: - { - integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==, - } + resolution: {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} dependencies: - "@chainsafe/as-sha256": 0.3.1 + '@chainsafe/as-sha256': 0.3.1 dev: true /@chainsafe/ssz@0.10.2: - resolution: - { - integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==, - } + resolution: {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} dependencies: - "@chainsafe/as-sha256": 0.3.1 - "@chainsafe/persistent-merkle-tree": 0.5.0 + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.5.0 dev: true /@chainsafe/ssz@0.9.4: - resolution: - { - integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==, - } + resolution: {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} dependencies: - "@chainsafe/as-sha256": 0.3.1 - "@chainsafe/persistent-merkle-tree": 0.4.2 + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.4.2 case: 1.6.3 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 /@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 + '@jridgewell/trace-mapping': 0.3.9 dev: true /@eslint-community/eslint-utils@4.4.0(eslint@8.56.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: @@ -216,19 +189,13 @@ packages: dev: true /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + 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) @@ -244,264 +211,204 @@ packages: dev: true /@eslint/js@8.56.0: - resolution: - { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /@ethersproject/abi@5.7.0: - resolution: - { - integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==, - } - dependencies: - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/strings": 5.7.0 + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 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 - "@ethersproject/logger": 5.7.0 - "@ethersproject/networks": 5.7.1 - "@ethersproject/properties": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/web": 5.7.1 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 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 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 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 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/rlp": 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 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 + '@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 + '@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 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 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 + '@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 + '@ethersproject/bignumber': 5.7.0 dev: true /@ethersproject/contracts@5.7.0: - resolution: - { - integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==, - } - dependencies: - "@ethersproject/abi": 5.7.0 - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/transactions": 5.7.0 + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 dev: true /@ethersproject/hash@5.7.0: - resolution: - { - integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==, - } - dependencies: - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/base64": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/strings": 5.7.0 + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 dev: true /@ethersproject/hdnode@5.7.0: - resolution: - { - integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==, - } - dependencies: - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/wordlists": 5.7.0 + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 dev: true /@ethersproject/json-wallets@5.7.0: - resolution: - { - integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==, - } - dependencies: - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/random": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 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 + '@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 + '@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 + '@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 + '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/providers@5.7.2: - resolution: - { - integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==, - } - dependencies: - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/base64": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/networks": 5.7.1 - "@ethersproject/properties": 5.7.0 - "@ethersproject/random": 5.7.0 - "@ethersproject/rlp": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/web": 5.7.1 + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 bech32: 1.1.4 ws: 7.4.6 transitivePeerDependencies: @@ -510,168 +417,129 @@ 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 + '@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 + '@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 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 dev: true /@ethersproject/signing-key@5.7.0: - resolution: - { - integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==, - } - dependencies: - "@ethersproject/bytes": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 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 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/strings": 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 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 - "@ethersproject/logger": 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/transactions@5.7.0: - resolution: - { - integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==, - } - dependencies: - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/rlp": 5.7.0 - "@ethersproject/signing-key": 5.7.0 + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 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 - "@ethersproject/logger": 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 dev: true /@ethersproject/wallet@5.7.0: - resolution: - { - integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==, - } - dependencies: - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/json-wallets": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/random": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/wordlists": 5.7.0 + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 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 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/strings": 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 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 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/strings": 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 dev: true /@fastify/busboy@2.1.0: - resolution: - { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} dev: true /@humanwhocodes/config-array@0.11.14: - resolution: - { - integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, - } - engines: { node: ">=10.10.0" } + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} dependencies: - "@humanwhocodes/object-schema": 2.0.2 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -679,26 +547,17 @@ 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@2.0.2: - resolution: - { - integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, - } + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true /@isaacs/cliui@8.0.2: - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 string-width-cjs: /string-width@4.2.3 @@ -709,36 +568,24 @@ packages: 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 + '@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 @@ -748,78 +595,54 @@ packages: dev: true /@noble/curves@1.2.0: - resolution: - { - integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==, - } + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} dependencies: - "@noble/hashes": 1.3.2 + '@noble/hashes': 1.3.2 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/hashes@1.3.2: - resolution: - { - integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==, - } - engines: { node: ">= 16" } + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} 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 + '@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 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.0 dev: true /@nomicfoundation/ethereumjs-block@5.0.2: - resolution: - { - integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==, - } - engines: { node: ">=14" } - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 ethereum-cryptography: 0.1.3 ethers: 5.7.2 transitivePeerDependencies: @@ -828,19 +651,16 @@ packages: dev: true /@nomicfoundation/ethereumjs-blockchain@7.0.2: - resolution: - { - integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==, - } - engines: { node: ">=14" } - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-ethash": 3.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-ethash': 3.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 abstract-level: 1.0.4 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 @@ -854,25 +674,19 @@ packages: dev: true /@nomicfoundation/ethereumjs-common@4.0.2: - resolution: - { - integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==, - } + resolution: {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} dependencies: - "@nomicfoundation/ethereumjs-util": 9.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 crc-32: 1.2.2 dev: true /@nomicfoundation/ethereumjs-ethash@3.0.2: - resolution: - { - integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==, - } - engines: { node: ">=14" } - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 abstract-level: 1.0.4 bigint-crypto-utils: 3.3.0 ethereum-cryptography: 0.1.3 @@ -882,16 +696,13 @@ packages: dev: true /@nomicfoundation/ethereumjs-evm@2.0.2: - resolution: - { - integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==, - } - engines: { node: ">=14" } - dependencies: - "@ethersproject/providers": 5.7.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} + engines: {node: '>=14'} + dependencies: + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -903,22 +714,16 @@ packages: dev: true /@nomicfoundation/ethereumjs-rlp@5.0.2: - resolution: - { - integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} + engines: {node: '>=14'} hasBin: true dev: true /@nomicfoundation/ethereumjs-statemanager@2.0.2: - resolution: - { - integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==, - } + resolution: {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 ethers: 5.7.2 @@ -930,31 +735,25 @@ packages: dev: true /@nomicfoundation/ethereumjs-trie@6.0.2: - resolution: - { - integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==, - } - engines: { node: ">=14" } - dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@types/readable-stream": 2.3.15 + resolution: {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@types/readable-stream': 2.3.15 ethereum-cryptography: 0.1.3 readable-stream: 3.6.2 dev: true /@nomicfoundation/ethereumjs-tx@5.0.2: - resolution: - { - integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==, - } - engines: { node: ">=14" } - dependencies: - "@chainsafe/ssz": 0.9.4 - "@ethersproject/providers": 5.7.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} + engines: {node: '>=14'} + dependencies: + '@chainsafe/ssz': 0.9.4 + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 ethereum-cryptography: 0.1.3 transitivePeerDependencies: - bufferutil @@ -962,33 +761,27 @@ packages: dev: true /@nomicfoundation/ethereumjs-util@9.0.2: - resolution: - { - integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==, - } - engines: { node: ">=14" } - dependencies: - "@chainsafe/ssz": 0.10.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 + resolution: {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} + engines: {node: '>=14'} + dependencies: + '@chainsafe/ssz': 0.10.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 ethereum-cryptography: 0.1.3 dev: true /@nomicfoundation/ethereumjs-vm@7.0.2: - resolution: - { - integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==, - } - engines: { node: ">=14" } - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 + resolution: {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -1000,18 +793,15 @@ packages: dev: true /@nomicfoundation/hardhat-chai-matchers@2.0.3(@nomicfoundation/hardhat-ethers@3.0.5)(chai@4.4.1)(ethers@6.10.0)(hardhat@2.19.4): - resolution: - { - integrity: sha512-A40s7EAK4Acr8UP1Yudgi9GGD9Cca/K3LHt3DzmRIje14lBfHtg9atGQ7qK56vdPcTwKmeaGn30FzxMUfPGEMw==, - } + resolution: {integrity: sha512-A40s7EAK4Acr8UP1Yudgi9GGD9Cca/K3LHt3DzmRIje14lBfHtg9atGQ7qK56vdPcTwKmeaGn30FzxMUfPGEMw==} peerDependencies: - "@nomicfoundation/hardhat-ethers": ^3.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 dependencies: - "@nomicfoundation/hardhat-ethers": 3.0.5(ethers@6.10.0)(hardhat@2.19.4) - "@types/chai-as-promised": 7.1.8 + '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.10.0)(hardhat@2.19.4) + '@types/chai-as-promised': 7.1.8 chai: 4.4.1 chai-as-promised: 7.1.1(chai@4.4.1) deep-eql: 4.1.3 @@ -1021,10 +811,7 @@ packages: dev: true /@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.10.0)(hardhat@2.19.4): - resolution: - { - integrity: sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==, - } + resolution: {integrity: sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==} peerDependencies: ethers: ^6.1.0 hardhat: ^2.0.0 @@ -1038,10 +825,7 @@ packages: dev: true /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.19.4): - resolution: - { - integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==, - } + resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} peerDependencies: hardhat: ^2.9.5 dependencies: @@ -1050,38 +834,35 @@ packages: dev: true /@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.3)(@nomicfoundation/hardhat-ethers@3.0.5)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.3)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.11)(@types/mocha@10.0.6)(@types/node@20.11.7)(chai@4.4.1)(ethers@6.10.0)(hardhat-gas-reporter@1.0.9)(hardhat@2.19.4)(solidity-coverage@0.8.6-sha1.0)(ts-node@11.0.0-beta.1)(typechain@8.3.2)(typescript@5.3.3): - resolution: - { - integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==, - } + resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} peerDependencies: - "@nomicfoundation/hardhat-chai-matchers": ^2.0.0 - "@nomicfoundation/hardhat-ethers": ^3.0.0 - "@nomicfoundation/hardhat-network-helpers": ^1.0.0 - "@nomicfoundation/hardhat-verify": ^2.0.0 - "@typechain/ethers-v6": ^0.5.0 - "@typechain/hardhat": ^9.0.0 - "@types/chai": ^4.2.0 - "@types/mocha": ">=9.1.0" - "@types/node": ">=16.0.0" + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': '>=16.0.0' chai: ^4.2.0 ethers: ^6.4.0 hardhat: ^2.11.0 hardhat-gas-reporter: ^1.0.8 solidity-coverage: ^0.8.1 - ts-node: ">=8.0.0" + ts-node: '>=8.0.0' typechain: ^8.3.0 - typescript: ">=4.5.0" - dependencies: - "@nomicfoundation/hardhat-chai-matchers": 2.0.3(@nomicfoundation/hardhat-ethers@3.0.5)(chai@4.4.1)(ethers@6.10.0)(hardhat@2.19.4) - "@nomicfoundation/hardhat-ethers": 3.0.5(ethers@6.10.0)(hardhat@2.19.4) - "@nomicfoundation/hardhat-network-helpers": 1.0.10(hardhat@2.19.4) - "@nomicfoundation/hardhat-verify": 2.0.3(hardhat@2.19.4) - "@typechain/ethers-v6": 0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3) - "@typechain/hardhat": 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.10.0)(hardhat@2.19.4)(typechain@8.3.2) - "@types/chai": 4.3.11 - "@types/mocha": 10.0.6 - "@types/node": 20.11.7 + typescript: '>=4.5.0' + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.3(@nomicfoundation/hardhat-ethers@3.0.5)(chai@4.4.1)(ethers@6.10.0)(hardhat@2.19.4) + '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.10.0)(hardhat@2.19.4) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.19.4) + '@nomicfoundation/hardhat-verify': 2.0.3(hardhat@2.19.4) + '@typechain/ethers-v6': 0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.10.0)(hardhat@2.19.4)(typechain@8.3.2) + '@types/chai': 4.3.11 + '@types/mocha': 10.0.6 + '@types/node': 20.11.7 chai: 4.4.1 ethers: 6.10.0 hardhat: 2.19.4(ts-node@11.0.0-beta.1)(typescript@5.3.3) @@ -1093,15 +874,12 @@ packages: dev: true /@nomicfoundation/hardhat-verify@2.0.3(hardhat@2.19.4): - resolution: - { - integrity: sha512-ESbRu9by53wu6VvgwtMtm108RSmuNsVqXtzg061D+/4R7jaWh/Wl/8ve+p6SdDX7vA1Z3L02hDO1Q3BY4luLXQ==, - } + resolution: {integrity: sha512-ESbRu9by53wu6VvgwtMtm108RSmuNsVqXtzg061D+/4R7jaWh/Wl/8ve+p6SdDX7vA1Z3L02hDO1Q3BY4luLXQ==} peerDependencies: hardhat: ^2.0.4 dependencies: - "@ethersproject/abi": 5.7.0 - "@ethersproject/address": 5.7.0 + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.4(supports-color@8.1.1) @@ -1115,11 +893,8 @@ 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 @@ -1127,11 +902,8 @@ 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 @@ -1139,11 +911,8 @@ 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 @@ -1151,11 +920,8 @@ 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 @@ -1163,11 +929,8 @@ 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 @@ -1175,11 +938,8 @@ 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 @@ -1187,11 +947,8 @@ 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 @@ -1199,11 +956,8 @@ 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 @@ -1211,11 +965,8 @@ 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 @@ -1223,11 +974,8 @@ 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 @@ -1235,140 +983,104 @@ 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 - "@nomicfoundation/solidity-analyzer-freebsd-x64": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.1 - dev: true - - /@openzeppelin/contracts@5.0.1: - resolution: - { - integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w==, - } - dev: true + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + dev: true + + /@openzeppelin/contracts@5.0.2: + resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + dev: false /@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} requiresBuild: true dev: true optional: true /@pkgr/core@0.1.1: - resolution: - { - integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } - dev: true - - /@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.19.4)(squirrelly@8.0.8): - resolution: - { - integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==, - } + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + + /@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.19.4)(squirrelly@9.0.0): + resolution: {integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==} peerDependencies: hardhat: ^2.6.4 squirrelly: ^8.0.8 dependencies: hardhat: 2.19.4(ts-node@11.0.0-beta.1)(typescript@5.3.3) - squirrelly: 8.0.8 + squirrelly: 9.0.0 dev: true /@scure/base@1.1.5: - resolution: - { - integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==, - } + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} 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 - "@scure/base": 1.1.5 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.5 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.5 + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.5 dev: true /@sentry/core@5.30.0: - resolution: - { - integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==, - } - engines: { node: ">=6" } - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 tslib: 1.14.1 dev: true /@sentry/hub@5.30.0: - resolution: - { - integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==, - } - engines: { node: ">=6" } - dependencies: - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 tslib: 1.14.1 dev: true /@sentry/minimal@5.30.0: - 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 + 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 tslib: 1.14.1 dev: true /@sentry/node@5.30.0: - resolution: - { - integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==, - } - engines: { node: ">=6" } - dependencies: - "@sentry/core": 5.30.0 - "@sentry/hub": 5.30.0 - "@sentry/tracing": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 cookie: 0.4.2 https-proxy-agent: 5.0.1 lru_map: 0.3.3 @@ -1378,100 +1090,67 @@ packages: dev: true /@sentry/tracing@5.30.0: - resolution: - { - integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==, - } - engines: { node: ">=6" } - dependencies: - "@sentry/hub": 5.30.0 - "@sentry/minimal": 5.30.0 - "@sentry/types": 5.30.0 - "@sentry/utils": 5.30.0 + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 tslib: 1.14.1 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 + '@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.2: - resolution: - { - integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==, - } + resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true /@solidity-parser/parser@0.17.0: - resolution: - { - integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==, - } + resolution: {integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==} dev: true /@tsconfig/node14@14.1.0: - resolution: - { - integrity: sha512-VmsCG04YR58ciHBeJKBDNMWWfYbyP8FekWVuTlpstaUPlat1D0x/tXzkWP7yCMU0eSz9V4OZU0LBWTFJ3xZf6w==, - } + resolution: {integrity: sha512-VmsCG04YR58ciHBeJKBDNMWWfYbyP8FekWVuTlpstaUPlat1D0x/tXzkWP7yCMU0eSz9V4OZU0LBWTFJ3xZf6w==} dev: true /@tsconfig/node16@16.1.1: - resolution: - { - integrity: sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==, - } + resolution: {integrity: sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==} dev: true /@tsconfig/node18@18.2.2: - resolution: - { - integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==, - } + resolution: {integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==} dev: true /@tsconfig/node20@20.1.2: - resolution: - { - integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==, - } + resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==} dev: true /@typechain/ethers-v6@0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3): - resolution: - { - integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==, - } + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: ethers: 6.x typechain: ^8.3.2 - typescript: ">=4.7.0" + typescript: '>=4.7.0' dependencies: ethers: 6.10.0 lodash: 4.17.21 @@ -1481,17 +1160,14 @@ packages: dev: true /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.10.0)(hardhat@2.19.4)(typechain@8.3.2): - resolution: - { - integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==, - } + resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} peerDependencies: - "@typechain/ethers-v6": ^0.5.1 + '@typechain/ethers-v6': ^0.5.1 ethers: ^6.1.0 hardhat: ^2.9.9 typechain: ^8.3.2 dependencies: - "@typechain/ethers-v6": 0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3) + '@typechain/ethers-v6': 0.5.1(ethers@6.10.0)(typechain@8.3.2)(typescript@5.3.3) ethers: 6.10.0 fs-extra: 9.1.0 hardhat: 2.19.4(ts-node@11.0.0-beta.1)(typescript@5.3.3) @@ -1499,208 +1175,136 @@ packages: 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": 20.11.7 + '@types/node': 20.11.7 dev: true /@types/bn.js@5.1.5: - resolution: - { - integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==, - } + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 dev: true /@types/chai-as-promised@7.1.8: - resolution: - { - integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==, - } + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} dependencies: - "@types/chai": 4.3.11 + '@types/chai': 4.3.11 dev: true /@types/chai@4.3.11: - resolution: - { - integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==, - } + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} dev: true /@types/concat-stream@1.6.1: - resolution: - { - integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==, - } + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 dev: true /@types/form-data@0.0.33: - resolution: - { - integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==, - } + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 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": 20.11.7 + '@types/minimatch': 5.1.2 + '@types/node': 20.11.7 dev: true /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 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@3.0.5: - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: true /@types/minimatch@5.1.2: - resolution: - { - integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, - } + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true /@types/mocha@10.0.6: - resolution: - { - integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==, - } + resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} dev: true /@types/node@10.17.60: - resolution: - { - integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==, - } + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true /@types/node@18.15.13: - resolution: - { - integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==, - } + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} dev: true /@types/node@20.11.7: - resolution: - { - integrity: sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==, - } + resolution: {integrity: sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==} dependencies: undici-types: 5.26.5 dev: true /@types/node@8.10.66: - resolution: - { - integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==, - } + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true /@types/pbkdf2@3.1.2: - resolution: - { - integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==, - } + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 dev: true /@types/prettier@2.7.3: - resolution: - { - integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, - } + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true /@types/qs@6.9.11: - resolution: - { - integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==, - } + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} dev: true /@types/readable-stream@2.3.15: - resolution: - { - integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==, - } + resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 safe-buffer: 5.1.2 dev: true /@types/secp256k1@4.0.6: - resolution: - { - integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==, - } + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} dependencies: - "@types/node": 20.11.7 + '@types/node': 20.11.7 dev: true /@types/semver@7.5.6: - resolution: - { - integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, - } + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} dev: true /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha eslint: ^7.0.0 || ^8.0.0 - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/type-utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 graphemer: 1.4.0 @@ -1714,22 +1318,19 @@ packages: dev: true /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 typescript: 5.3.3 @@ -1738,31 +1339,25 @@ packages: dev: true /@typescript-eslint/scope-manager@6.19.1: - resolution: - { - integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 dev: true /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4(supports-color@8.1.1) eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -1772,27 +1367,21 @@ packages: dev: true /@typescript-eslint/types@6.19.1: - resolution: - { - integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): - resolution: - { - integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -1805,20 +1394,17 @@ packages: dev: true /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -1827,36 +1413,24 @@ packages: dev: true /@typescript-eslint/visitor-keys@6.19.1: - resolution: - { - integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - "@typescript-eslint/types": 6.19.1 + '@typescript-eslint/types': 6.19.1 eslint-visitor-keys: 3.4.3 dev: true /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true /abbrev@1.0.9: - resolution: - { - integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==, - } + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true /abstract-level@1.0.4: - resolution: - { - integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} + engines: {node: '>=12'} dependencies: buffer: 6.0.3 catering: 2.1.1 @@ -1868,10 +1442,7 @@ packages: dev: true /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -1879,58 +1450,37 @@ packages: dev: true /acorn-walk@8.3.2: - resolution: - { - integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} dev: true /acorn@8.11.3: - resolution: - { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} hasBin: true 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 /aes-js@4.0.0-beta.5: - resolution: - { - integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==, - } + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} 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: @@ -1938,21 +1488,15 @@ 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 @@ -1961,10 +1505,7 @@ 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 @@ -1973,166 +1514,109 @@ 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'} requiresBuild: true dev: true optional: 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@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 /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.5 is-array-buffer: 3.0.2 dev: true /array-includes@3.1.7: - resolution: - { - integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -2142,27 +1626,18 @@ 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.findlastindex@1.2.3: - resolution: - { - integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -2172,11 +1647,8 @@ packages: dev: true /array.prototype.flat@1.3.2: - resolution: - { - integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -2185,11 +1657,8 @@ packages: dev: true /array.prototype.flatmap@1.3.2: - resolution: - { - integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -2198,11 +1667,8 @@ packages: dev: true /arraybuffer.prototype.slice@1.0.2: - resolution: - { - integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 @@ -2214,62 +1680,38 @@ packages: dev: true /asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true /assertion-error@1.1.0: - resolution: - { - integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, - } + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 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@1.5.2: - resolution: - { - integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==, - } + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} 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 /axios@1.6.7: - resolution: - { - integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, - } + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 @@ -2279,113 +1721,71 @@ 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 /bech32@1.1.4: - resolution: - { - integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, - } + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} dev: true /bigint-crypto-utils@3.3.0: - resolution: - { - integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: '>=14.0.0'} 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.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 /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.4 catering: 2.1.1 @@ -2394,17 +1794,11 @@ 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 @@ -2415,19 +1809,13 @@ 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 @@ -2435,59 +1823,38 @@ 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-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 /builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} dev: true /builtins@5.0.1: - resolution: - { - integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==, - } + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: semver: 7.5.4 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.5: - resolution: - { - integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, - } + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 @@ -2495,72 +1862,48 @@ packages: 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@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} dev: true /case@1.6.3: - resolution: - { - integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} 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.4.1): - resolution: - { - integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==, - } + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} peerDependencies: - chai: ">= 2.1.2 < 5" + chai: '>= 2.1.2 < 5' dependencies: chai: 4.4.1 check-error: 1.0.3 dev: true /chai@4.4.1: - resolution: - { - integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -2572,11 +1915,8 @@ 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 @@ -2584,38 +1924,26 @@ 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 /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.3: - resolution: - { - integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, - } + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 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 @@ -2629,28 +1957,19 @@ 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.4.1: - resolution: - { - integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==} + engines: {node: '>=12'} requiresBuild: true dependencies: abstract-level: 1.0.4 @@ -2661,19 +1980,13 @@ 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-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 @@ -2682,22 +1995,16 @@ 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: - "@colors/colors": 1.5.0 + '@colors/colors': 1.5.0 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 @@ -2705,69 +2012,45 @@ 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 /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 @@ -2776,11 +2059,8 @@ 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 @@ -2789,33 +2069,21 @@ packages: dev: true /commander@3.0.2: - resolution: - { - integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==, - } + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} dev: true /commander@8.3.0: - resolution: - { - integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} 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 @@ -2824,34 +2092,22 @@ packages: 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 /core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 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 @@ -2861,10 +2117,7 @@ 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 @@ -2875,11 +2128,8 @@ packages: 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 @@ -2887,26 +2137,17 @@ 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 /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@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true @@ -2915,13 +2156,10 @@ 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: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true @@ -2931,44 +2169,29 @@ packages: 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-data-property@1.1.1: - resolution: - { - integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 @@ -2976,11 +2199,8 @@ packages: dev: true /define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 has-property-descriptors: 1.0.1 @@ -2988,26 +2208,17 @@ packages: 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 /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 @@ -3017,80 +2228,53 @@ packages: 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 /dotenv@16.4.1: - resolution: - { - integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} dev: true /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 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 @@ -3102,62 +2286,41 @@ packages: 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 /enhanced-resolve@5.15.0: - resolution: - { - integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: true /enquirer@2.4.1: - resolution: - { - integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 dev: true /ensure-posix-path@1.1.1: - resolution: - { - integrity: sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==, - } + resolution: {integrity: sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==} 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 /es-abstract@1.22.3: - resolution: - { - integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -3201,11 +2364,8 @@ packages: dev: true /es-set-tostringtag@2.0.2: - resolution: - { - integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 @@ -3213,20 +2373,14 @@ packages: dev: true /es-shim-unscopables@1.0.2: - resolution: - { - integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, - } + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: hasown: 2.0.0 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 @@ -3234,35 +2388,23 @@ 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-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 @@ -3274,39 +2416,30 @@ packages: dev: true /eslint-compat-utils@0.1.2(eslint@8.56.0): - resolution: - { - integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} peerDependencies: - eslint: ">=6.0.0" + eslint: '>=6.0.0' dependencies: eslint: 8.56.0 dev: true /eslint-config-prettier@9.1.0(eslint@8.56.0): - resolution: - { - integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, - } + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' dependencies: eslint: 8.56.0 dev: true /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.56.0): - resolution: - { - integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} peerDependencies: eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 - eslint-plugin-n: "^15.0.0 || ^16.0.0 " + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.56.0 @@ -3316,10 +2449,7 @@ packages: dev: true /eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.13.1 @@ -3329,14 +2459,11 @@ packages: dev: true /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.19.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0): - resolution: - { - integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: "*" - eslint-plugin-import: "*" + eslint: '*' + eslint-plugin-import: '*' dependencies: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 @@ -3348,26 +2475,23 @@ packages: is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: - - "@typescript-eslint/parser" + - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color dev: true /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: - { - integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} peerDependencies: - "@typescript-eslint/parser": "*" - eslint: "*" - eslint-import-resolver-node: "*" - eslint-import-resolver-typescript: "*" - eslint-import-resolver-webpack: "*" + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' peerDependenciesMeta: - "@typescript-eslint/parser": + '@typescript-eslint/parser': optional: true eslint: optional: true @@ -3378,7 +2502,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 @@ -3388,34 +2512,28 @@ packages: dev: true /eslint-plugin-es-x@7.5.0(eslint@8.56.0): - resolution: - { - integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: ">=8" + eslint: '>=8' dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@eslint-community/regexpp": 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 eslint: 8.56.0 eslint-compat-utils: 0.1.2(eslint@8.56.0) dev: true /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.19.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): - resolution: - { - integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} peerDependencies: - "@typescript-eslint/parser": "*" + '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 peerDependenciesMeta: - "@typescript-eslint/parser": + '@typescript-eslint/parser': optional: true dependencies: - "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -3441,15 +2559,12 @@ packages: dev: true /eslint-plugin-n@16.6.2(eslint@8.56.0): - resolution: - { - integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==, - } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} + engines: {node: '>=16.0.0'} peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) builtins: 5.0.1 eslint: 8.56.0 eslint-plugin-es-x: 7.5.0(eslint@8.56.0) @@ -3464,18 +2579,15 @@ packages: dev: true /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.4): - resolution: - { - integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - eslint-config-prettier: "*" - prettier: ">=3.0.0" + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' peerDependenciesMeta: - "@types/eslint": + '@types/eslint': optional: true eslint-config-prettier: optional: true @@ -3488,11 +2600,8 @@ packages: dev: true /eslint-plugin-promise@6.1.1(eslint@8.56.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: @@ -3500,40 +2609,31 @@ packages: dev: true /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /eslint@8.56.0: - resolution: - { - integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.56.0 - "@humanwhocodes/config-array": 0.11.14 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -3569,11 +2669,8 @@ packages: dev: true /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -3581,79 +2678,55 @@ 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@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 /eth-gas-reporter@0.2.27: - resolution: - { - integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==, - } + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} peerDependencies: - "@codechecks/client": ^0.1.0 + '@codechecks/client': ^0.1.0 peerDependenciesMeta: - "@codechecks/client": + '@codechecks/client': optional: true dependencies: - "@solidity-parser/parser": 0.14.5 + '@solidity-parser/parser': 0.14.5 axios: 1.6.7 cli-table3: 0.5.1 colors: 1.4.0 @@ -3673,13 +2746,10 @@ packages: 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.2 - "@types/secp256k1": 4.0.6 + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -3696,34 +2766,25 @@ 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 - "@scure/bip32": 1.1.5 - "@scure/bip39": 1.1.1 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 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 + '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 elliptic: 6.5.4 @@ -3733,13 +2794,10 @@ 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.5 + '@types/bn.js': 5.1.5 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -3747,57 +2805,51 @@ packages: dev: true /ethers@5.7.2: - resolution: - { - integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==, - } - dependencies: - "@ethersproject/abi": 5.7.0 - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/base64": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/contracts": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/json-wallets": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/networks": 5.7.1 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@ethersproject/random": 5.7.0 - "@ethersproject/rlp": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/solidity": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/units": 5.7.0 - "@ethersproject/wallet": 5.7.0 - "@ethersproject/web": 5.7.1 - "@ethersproject/wordlists": 5.7.0 + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate dev: true /ethers@6.10.0: - resolution: - { - integrity: sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@adraffy/ens-normalize": 1.10.0 - "@noble/curves": 1.2.0 - "@noble/hashes": 1.3.2 - "@types/node": 18.15.13 + resolution: {integrity: sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 aes-js: 4.0.0-beta.5 tslib: 2.4.0 ws: 8.5.0 @@ -3807,134 +2859,92 @@ packages: 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 /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 /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.3.0: - resolution: - { - integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, - } + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 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.17.0: - resolution: - { - integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==, - } + resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} dependencies: reusify: 1.0.4 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.2.0 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 /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@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.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.2.9 keyv: 4.5.4 @@ -3942,28 +2952,19 @@ packages: 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.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /follow-redirects@1.15.5(debug@4.3.4): - resolution: - { - integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} peerDependencies: - debug: "*" + debug: '*' peerDependenciesMeta: debug: optional: true @@ -3972,31 +2973,22 @@ 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 /foreground-child@3.1.1: - resolution: - { - integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 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 @@ -4004,11 +2996,8 @@ 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 @@ -4016,17 +3005,11 @@ packages: dev: true /fp-ts@1.19.3: - resolution: - { - integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==, - } + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} 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 @@ -4036,11 +3019,8 @@ 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 @@ -4048,11 +3028,8 @@ 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 @@ -4060,11 +3037,8 @@ 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 @@ -4073,43 +3047,28 @@ 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.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true dev: true optional: true /function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /function.prototype.name@1.1.6: - resolution: - { - integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -4118,39 +3077,24 @@ 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.2: - resolution: - { - integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, - } + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true /get-intrinsic@1.2.2: - resolution: - { - integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, - } + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: function-bind: 1.1.2 has-proto: 1.0.1 @@ -4159,38 +3103,26 @@ 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-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.5 get-intrinsic: 1.2.2 dev: true /get-tsconfig@4.7.2: - resolution: - { - integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, - } + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 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 @@ -4198,31 +3130,22 @@ packages: 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@10.3.10: - resolution: - { - integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 @@ -4233,10 +3156,7 @@ packages: 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 @@ -4246,10 +3166,7 @@ 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 @@ -4260,10 +3177,7 @@ 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 @@ -4274,10 +3188,7 @@ 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 @@ -4288,21 +3199,15 @@ packages: 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 @@ -4310,33 +3215,24 @@ packages: dev: true /globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + 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.1 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 + '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 @@ -4347,11 +3243,8 @@ 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 @@ -4362,34 +3255,22 @@ packages: dev: true /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.2 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 /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true /handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: ">=0.4.7" } + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true dependencies: minimist: 1.2.8 @@ -4401,10 +3282,7 @@ packages: dev: true /hardhat-contract-sizer@2.10.0(hardhat@2.19.4): - resolution: - { - integrity: sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==, - } + resolution: {integrity: sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==} peerDependencies: hardhat: ^2.0.0 dependencies: @@ -4415,10 +3293,7 @@ packages: dev: true /hardhat-gas-reporter@1.0.9(hardhat@2.19.4): - resolution: - { - integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==, - } + resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: @@ -4427,43 +3302,40 @@ packages: hardhat: 2.19.4(ts-node@11.0.0-beta.1)(typescript@5.3.3) sha1: 1.1.1 transitivePeerDependencies: - - "@codechecks/client" + - '@codechecks/client' - bufferutil - debug - utf-8-validate dev: true /hardhat@2.19.4(ts-node@11.0.0-beta.1)(typescript@5.3.3): - resolution: - { - integrity: sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ==, - } + resolution: {integrity: sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ==} hasBin: true peerDependencies: - ts-node: "*" - typescript: "*" + ts-node: '*' + typescript: '*' peerDependenciesMeta: ts-node: optional: true typescript: optional: true dependencies: - "@ethersproject/abi": 5.7.0 - "@metamask/eth-sig-util": 4.0.1 - "@nomicfoundation/ethereumjs-block": 5.0.2 - "@nomicfoundation/ethereumjs-blockchain": 7.0.2 - "@nomicfoundation/ethereumjs-common": 4.0.2 - "@nomicfoundation/ethereumjs-evm": 2.0.2 - "@nomicfoundation/ethereumjs-rlp": 5.0.2 - "@nomicfoundation/ethereumjs-statemanager": 2.0.2 - "@nomicfoundation/ethereumjs-trie": 6.0.2 - "@nomicfoundation/ethereumjs-tx": 5.0.2 - "@nomicfoundation/ethereumjs-util": 9.0.2 - "@nomicfoundation/ethereumjs-vm": 7.0.2 - "@nomicfoundation/solidity-analyzer": 0.1.1 - "@sentry/node": 5.30.0 - "@types/bn.js": 5.1.5 - "@types/lru-cache": 5.1.1 + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.2 + '@nomicfoundation/ethereumjs-blockchain': 7.0.2 + '@nomicfoundation/ethereumjs-common': 4.0.2 + '@nomicfoundation/ethereumjs-evm': 2.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-statemanager': 2.0.2 + '@nomicfoundation/ethereumjs-trie': 6.0.2 + '@nomicfoundation/ethereumjs-tx': 5.0.2 + '@nomicfoundation/ethereumjs-util': 9.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.2 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -4505,77 +3377,50 @@ 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.1: - resolution: - { - integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, - } + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.2 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 /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 @@ -4583,45 +3428,30 @@ packages: 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 /hasown@2.0.0: - resolution: - { - integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 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 @@ -4629,11 +3459,8 @@ packages: 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 @@ -4642,11 +3469,8 @@ 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 @@ -4656,20 +3480,14 @@ 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 + '@types/node': 10.17.60 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) @@ -4678,94 +3496,61 @@ packages: 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.3.0: - resolution: - { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} dev: true /immutable@4.3.5: - resolution: - { - integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==, - } + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} 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 /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.6: - resolution: - { - integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 hasown: 2.0.0 @@ -4773,27 +3558,18 @@ 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 /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.5 get-intrinsic: 1.2.2 @@ -4801,283 +3577,187 @@ packages: 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.5 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-builtin-module@3.2.1: - resolution: - { - integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 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.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 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-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-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-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@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.5 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.5 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-typed-array@1.1.12: - resolution: - { - integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.13 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.5 dev: true /isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true /isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /jackspeak@2.3.6: - resolution: - { - integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 optionalDependencies: - "@pkgjs/parseargs": 0.11.0 + '@pkgjs/parseargs': 0.11.0 dev: true /js-sdsl@4.4.2: - resolution: - { - integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==, - } + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} dev: true /js-sha3@0.8.0: - resolution: - { - integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, - } + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} 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 @@ -5085,76 +3765,49 @@ 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 /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 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-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 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.1 optionalDependencies: @@ -5162,18 +3815,12 @@ packages: dev: true /jsonschema@1.4.1: - resolution: - { - integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==, - } + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} dev: true /keccak@3.0.4: - resolution: - { - integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} requiresBuild: true dependencies: node-addon-api: 2.0.2 @@ -5182,238 +3829,157 @@ packages: dev: true /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 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 /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.4.1 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 /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@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.clonedeep@4.5.0: - resolution: - { - integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, - } + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true /lodash.isequal@4.5.0: - resolution: - { - integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, - } + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true /lodash.truncate@4.4.2: - resolution: - { - integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, - } + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 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 /loupe@2.3.7: - resolution: - { - integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, - } + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 dev: true /lru-cache@10.2.0: - resolution: - { - integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==, - } - engines: { node: 14 || >=16.14 } + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} 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 /markdown-table@1.1.3: - resolution: - { - integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==, - } + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} dev: true /matcher-collection@2.0.1: - resolution: - { - integrity: sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==} + engines: {node: 6.* || 8.* || >= 10.*} dependencies: - "@types/minimatch": 3.0.5 + '@types/minimatch': 3.0.5 minimatch: 3.1.2 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 @@ -5421,11 +3987,8 @@ packages: 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.4 functional-red-black-tree: 1.0.1 @@ -5433,142 +3996,94 @@ 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 /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 /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 /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.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@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true /minipass@7.0.4: - resolution: - { - integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} 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 @@ -5595,136 +4110,85 @@ packages: 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.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 /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@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 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-gyp-build@4.8.0: - resolution: - { - integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==, - } + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} 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-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 /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.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - } + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 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.5: - resolution: - { - integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -5733,11 +4197,8 @@ packages: dev: true /object.fromentries@2.0.7: - resolution: - { - integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -5745,10 +4206,7 @@ packages: dev: true /object.groupby@1.0.1: - resolution: - { - integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==, - } + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -5757,11 +4215,8 @@ packages: dev: true /object.values@1.1.7: - resolution: - { - integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -5769,27 +4224,18 @@ packages: dev: true /obliterator@2.0.4: - resolution: - { - integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, - } + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} 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 /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 @@ -5800,13 +4246,10 @@ packages: dev: true /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 @@ -5815,166 +4258,109 @@ 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@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@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 /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 /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-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true /path-scurry@1.10.1: - resolution: - { - integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 minipass: 7.0.4 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 @@ -5984,143 +4370,95 @@ packages: 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 /pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} 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.3.0 dev: true /prettier-plugin-solidity@1.3.1(prettier@3.2.4): - resolution: - { - integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==} + engines: {node: '>=16'} peerDependencies: - prettier: ">=2.3.0" + prettier: '>=2.3.0' dependencies: - "@solidity-parser/parser": 0.17.0 + '@solidity-parser/parser': 0.17.0 prettier: 3.2.4 semver: 7.5.4 solidity-comments-extractor: 0.0.8 dev: true /prettier@2.8.8: - resolution: - { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} hasBin: true dev: true /prettier@3.2.4: - resolution: - { - integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + engines: {node: '>=14'} 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 /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true /punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} dev: true /qs@6.11.2: - resolution: - { - integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: true /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 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 @@ -6129,10 +4467,7 @@ 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 @@ -6144,11 +4479,8 @@ 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 @@ -6156,49 +4488,34 @@ packages: 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.8 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 /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.5.1: - resolution: - { - integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6206,85 +4523,55 @@ packages: 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 /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 /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-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 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.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: is-core-module: 2.13.1 @@ -6293,95 +4580,65 @@ packages: 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 /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 /rimraf@5.0.5: - resolution: - { - integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} hasBin: true dependencies: glob: 10.3.10 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 /safe-array-concat@1.1.0: - resolution: - { - integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==, - } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -6390,25 +4647,16 @@ packages: 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.2: - resolution: - { - integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -6416,17 +4664,11 @@ 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 @@ -6446,18 +4688,12 @@ packages: 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 @@ -6466,47 +4702,32 @@ packages: dev: true /semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: true /semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 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 /set-function-length@1.2.0: - resolution: - { - integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 function-bind: 1.1.2 @@ -6516,11 +4737,8 @@ packages: dev: true /set-function-name@2.0.1: - resolution: - { - integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 @@ -6528,24 +4746,15 @@ packages: 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 @@ -6553,39 +4762,27 @@ 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 @@ -6594,10 +4791,7 @@ packages: dev: true /side-channel@1.0.4: - resolution: - { - integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, - } + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -6605,27 +4799,18 @@ packages: dev: true /signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} 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@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 @@ -6633,11 +4818,8 @@ packages: 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 @@ -6654,11 +4836,8 @@ packages: dev: true /solc@0.8.21: - resolution: - { - integrity: sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==} + engines: {node: '>=10.0.0'} hasBin: true dependencies: command-exists: 1.2.9 @@ -6673,23 +4852,17 @@ packages: dev: true /solidity-comments-extractor@0.0.8: - resolution: - { - integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==, - } + resolution: {integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==} dev: true /solidity-coverage@0.8.6-sha1.0(hardhat@2.19.4): - resolution: - { - integrity: sha512-BOkCMqt1XoElZgPSilFYf9jT5KPqcffEO/uopy0gUTVy5dtQvCKByKafM6n6RlJzWAYyD18/ZtcE45rUKOhdmA==, - } + resolution: {integrity: sha512-BOkCMqt1XoElZgPSilFYf9jT5KPqcffEO/uopy0gUTVy5dtQvCKByKafM6n6RlJzWAYyD18/ZtcE45rUKOhdmA==} hasBin: true peerDependencies: hardhat: ^2.11.0 dependencies: - "@ethersproject/abi": 5.7.0 - "@solidity-parser/parser": 0.16.2 + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.16.2 chalk: 2.4.2 death: 1.1.0 detect-port: 1.5.1 @@ -6714,21 +4887,15 @@ 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 @@ -6736,70 +4903,46 @@ 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 /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" } + /squirrelly@9.0.0: + resolution: {integrity: sha512-MutQSfwrpIxvdUOFJ8XOfRSioLy+9O10bmBVWLik4uzJkD5TbeNSTOCKqLjzZJVcgdJNyLc8JRFUN15qFlZx9Q==} + engines: {node: '>=6.0.0'} 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 /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 /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@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 @@ -6807,11 +4950,8 @@ 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 @@ -6819,11 +4959,8 @@ packages: dev: true /string.prototype.trim@1.2.8: - resolution: - { - integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6831,10 +4968,7 @@ packages: dev: true /string.prototype.trimend@1.0.7: - resolution: - { - integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==, - } + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6842,10 +4976,7 @@ packages: dev: true /string.prototype.trimstart@1.0.7: - resolution: - { - integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==, - } + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -6853,133 +4984,91 @@ 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 /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@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.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + 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-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-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@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 @@ -6987,31 +5076,22 @@ 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 /synckit@0.8.8: - resolution: - { - integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: - "@pkgr/core": 0.1.1 + '@pkgr/core': 0.1.1 tslib: 2.6.2 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 @@ -7020,11 +5100,8 @@ 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 @@ -7034,31 +5111,22 @@ packages: dev: true /tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} 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" } - dependencies: - "@types/concat-stream": 1.6.1 - "@types/form-data": 0.0.33 - "@types/node": 8.10.66 - "@types/qs": 6.9.11 + 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 + '@types/node': 8.10.66 + '@types/qs': 6.9.11 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.1 @@ -7069,50 +5137,35 @@ packages: 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 /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} peerDependencies: - typescript: ">=4.2.0" + typescript: '>=4.2.0' dependencies: typescript: 5.3.3 dev: true /ts-command-line-args@2.5.1: - resolution: - { - integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==, - } + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true dependencies: chalk: 4.1.2 @@ -7122,39 +5175,33 @@ packages: dev: true /ts-essentials@7.0.3(typescript@5.3.3): - resolution: - { - integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==, - } + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: - typescript: ">=3.7.0" + typescript: '>=3.7.0' dependencies: typescript: 5.3.3 dev: true /ts-node@11.0.0-beta.1(@types/node@20.11.7)(typescript@5.3.3): - resolution: - { - integrity: sha512-WMSROP+1pU22Q/Tm40mjfRg130yD8i0g6ROST04ZpocfH8sl1zD75ON4XQMcBEVViXMVemJBH0alflE7xePdRA==, - } + resolution: {integrity: sha512-WMSROP+1pU22Q/Tm40mjfRg130yD8i0g6ROST04ZpocfH8sl1zD75ON4XQMcBEVViXMVemJBH0alflE7xePdRA==} hasBin: true peerDependencies: - "@swc/core": ">=1.3.85" - "@swc/wasm": ">=1.3.85" - "@types/node": "*" - typescript: ">=4.4" + '@swc/core': '>=1.3.85' + '@swc/wasm': '>=1.3.85' + '@types/node': '*' + typescript: '>=4.4' peerDependenciesMeta: - "@swc/core": + '@swc/core': optional: true - "@swc/wasm": + '@swc/wasm': optional: true dependencies: - "@cspotcode/source-map-support": 0.8.1 - "@tsconfig/node14": 14.1.0 - "@tsconfig/node16": 16.1.1 - "@tsconfig/node18": 18.2.2 - "@tsconfig/node20": 20.1.2 - "@types/node": 20.11.7 + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.0 + '@tsconfig/node16': 16.1.1 + '@tsconfig/node18': 18.2.2 + '@tsconfig/node20': 20.1.2 + '@types/node': 20.11.7 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -7165,121 +5212,79 @@ packages: dev: true /tsconfig-paths@3.15.0: - resolution: - { - integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, - } + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: - "@types/json5": 0.0.29 + '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 dev: true /tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true /tslib@2.4.0: - resolution: - { - integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==, - } + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true /tsort@0.0.1: - resolution: - { - integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==, - } + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} dev: true /tweetnacl-util@0.15.1: - resolution: - { - integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==, - } + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} 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.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.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 /typechain@8.3.2(typescript@5.3.3): - resolution: - { - integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==, - } + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: - typescript: ">=4.3.0" + typescript: '>=4.3.0' dependencies: - "@types/prettier": 2.7.3 + '@types/prettier': 2.7.3 debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 @@ -7295,11 +5300,8 @@ packages: dev: true /typed-array-buffer@1.0.0: - resolution: - { - integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 @@ -7307,11 +5309,8 @@ packages: dev: true /typed-array-byte-length@1.0.0: - resolution: - { - integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 for-each: 0.3.3 @@ -7320,11 +5319,8 @@ packages: dev: true /typed-array-byte-offset@1.0.0: - resolution: - { - integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 @@ -7334,10 +5330,7 @@ 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.5 for-each: 0.3.3 @@ -7345,53 +5338,35 @@ 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.3.3: - resolution: - { - integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} 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.5 has-bigints: 1.0.2 @@ -7400,95 +5375,62 @@ packages: dev: true /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true /undici@5.28.2: - resolution: - { - integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, - } - engines: { node: ">=14.0" } + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + engines: {node: '>=14.0'} dependencies: - "@fastify/busboy": 2.1.0 + '@fastify/busboy': 2.1.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.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + 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.1 dev: true /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 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 /walk-sync@3.0.0: - resolution: - { - integrity: sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw==, - } - engines: { node: 10.* || >= 12.* } + resolution: {integrity: sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw==} + engines: {node: 10.* || >= 12.*} dependencies: - "@types/minimatch": 3.0.5 + '@types/minimatch': 3.0.5 ensure-posix-path: 1.1.1 matcher-collection: 2.0.1 minimatch: 3.1.2 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 @@ -7498,11 +5440,8 @@ packages: dev: true /which-typed-array@1.1.13: - resolution: - { - integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 @@ -7512,65 +5451,44 @@ 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 /word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + 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@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 @@ -7578,11 +5496,8 @@ packages: dev: true /wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 @@ -7590,18 +5505,12 @@ 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 @@ -7613,11 +5522,8 @@ 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 @@ -7629,11 +5535,8 @@ packages: dev: true /ws@8.5.0: - resolution: - { - integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -7645,41 +5548,26 @@ packages: 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 /yargs-parser@20.2.4: - resolution: - { - integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} 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 @@ -7688,11 +5576,8 @@ 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 @@ -7704,9 +5589,6 @@ packages: 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 From ce6791b89bb836fb881dca909fbe35e2d08e9bca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:01:01 +0000 Subject: [PATCH 08/15] Bump follow-redirects from 1.15.5 to 1.15.6 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 891a95a0..eccb21e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1713,7 +1713,7 @@ packages: /axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -2960,8 +2960,8 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4824,7 +4824,7 @@ packages: dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -4842,7 +4842,7 @@ packages: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 From eb8c79eb823f795b57ebf0599aedf709ac7cdfb1 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Thu, 14 Mar 2024 20:37:29 -0500 Subject: [PATCH 09/15] Includes token attributes for signed ints and refactors interface. Interface was refactoring purely for ordering purposes. --- .../extension/tokenAttributes/IERC7508.sol | 1023 ++++++++++------- .../RMRKTokenAttributesRepository.sol | 293 ++++- hardhat.config.ts | 1 + test/extensions/tokenAttributesRepository.ts | 343 +++--- test/interfaces.ts | 2 +- 5 files changed, 1000 insertions(+), 662 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol index dc0dcc12..c5afb16d 100644 --- a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol +++ b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.21; -import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; /** - * @title IERC7508 + * @title ERC-7508 Public On-Chain NFT Attributes Repository * @author RMRK team - * @notice Interface smart contract of the RMRK token properties extension. + * @notice Interface smart contract of Dynamic On-Chain Token Attributes Repository */ interface IERC7508 is IERC165 { /** @@ -27,53 +27,63 @@ interface IERC7508 is IERC165 { } /** - * @notice Structure used to represent a string attribute. + * @notice Structure used to represent an address attribute. * @return key The key of the attribute * @return value The value of the attribute */ - struct StringAttribute { + struct AddressAttribute { string key; - string value; + address value; } /** - * @notice Structure used to represent an uint attribute. + * @notice Structure used to represent a boolean attribute. * @return key The key of the attribute * @return value The value of the attribute */ - struct UintAttribute { + struct BoolAttribute { string key; - uint256 value; + bool value; } /** - * @notice Structure used to represent a boolean attribute. + * @notice Structure used to represent a bytes attribute. * @return key The key of the attribute * @return value The value of the attribute */ - struct BoolAttribute { + struct BytesAttribute { string key; - bool value; + bytes value; } /** - * @notice Structure used to represent an address attribute. + * @notice Structure used to represent an int attribute. * @return key The key of the attribute * @return value The value of the attribute */ - struct AddressAttribute { + struct IntAttribute { string key; - address value; + int256 value; } /** - * @notice Structure used to represent a bytes attribute. + * @notice Structure used to represent a string attribute. * @return key The key of the attribute * @return value The value of the attribute */ - struct BytesAttribute { + struct StringAttribute { string key; - bytes value; + string value; + } + + /** + * @notice Structure used to represent an uint attribute. + * @return key The key of the attribute + * @return value The value of the attribute + */ + struct UintAttribute { + string key; + uint256 value; } /** @@ -129,75 +139,118 @@ interface IERC7508 is IERC165 { ); /** - * @notice Used to notify listeners that a string attribute has been updated. + * @notice Used to notify listeners that an address attribute has been updated. * @param collection The collection address * @param tokenId The token ID * @param key The key of the attribute * @param value The new value of the attribute */ - event StringAttributeUpdated( + event AddressAttributeUpdated( address indexed collection, uint256 indexed tokenId, string key, - string value + address value ); /** - * @notice Used to notify listeners that an uint attribute has been updated. + * @notice Used to notify listeners that a boolean attribute has been updated. * @param collection The collection address * @param tokenId The token ID * @param key The key of the attribute * @param value The new value of the attribute */ - event UintAttributeUpdated( + event BoolAttributeUpdated( address indexed collection, uint256 indexed tokenId, string key, - uint256 value + bool value ); /** - * @notice Used to notify listeners that a boolean attribute has been updated. + * @notice Used to notify listeners that a bytes attribute has been updated. * @param collection The collection address * @param tokenId The token ID * @param key The key of the attribute * @param value The new value of the attribute */ - event BoolAttributeUpdated( + event BytesAttributeUpdated( address indexed collection, uint256 indexed tokenId, string key, - bool value + bytes value ); /** - * @notice Used to notify listeners that an address attribute has been updated. + * @notice Used to notify listeners that an int attribute has been updated. * @param collection The collection address * @param tokenId The token ID * @param key The key of the attribute * @param value The new value of the attribute */ - event AddressAttributeUpdated( + event IntAttributeUpdated( address indexed collection, uint256 indexed tokenId, string key, - address value + int256 value ); /** - * @notice Used to notify listeners that a bytes attribute has been updated. + * @notice Used to notify listeners that a string attribute has been updated. * @param collection The collection address * @param tokenId The token ID * @param key The key of the attribute * @param value The new value of the attribute */ - event BytesAttributeUpdated( + event StringAttributeUpdated( address indexed collection, uint256 indexed tokenId, string key, - bytes value + string value ); + /** + * @notice Used to notify listeners that an uint attribute has been updated. + * @param collection The collection address + * @param tokenId The token ID + * @param key The key of the attribute + * @param value The new value of the attribute + */ + event UintAttributeUpdated( + address indexed collection, + uint256 indexed tokenId, + string key, + uint256 value + ); + + // ------------------- ACCESS CONTROL ------------------- + + /** + * @notice Used to check if the specified address is listed as a collaborator of the given collection's parameter. + * @param collaborator Address to be checked. + * @param collection Address of the collection. + * @return isCollaborator_ Boolean value indicating if the address is a collaborator of the given collection's (`true`) or not + * (`false`). + */ + function isCollaborator( + address collaborator, + address collection + ) external view returns (bool isCollaborator_); + + /** + * @notice Used to check if the specified address is listed as a specific address of the given collection's + * parameter. + * @param specificAddress Address to be checked. + * @param collection Address of the collection. + * @param key The key of the attribute + * @return isSpecificAddress_ Boolean value indicating if the address is a specific address of the given collection's parameter + * (`true`) or not (`false`). + */ + function isSpecificAddress( + address specificAddress, + address collection, + string memory key + ) external view returns (bool isSpecificAddress_); + /** * @notice Used to register a collection to use the RMRK token attributes repository. * @dev If the collection does not implement the Ownable interface, the `useOwnable` value must be set to `false`. @@ -254,6 +307,8 @@ interface IERC7508 is IERC165 { bool[] memory collaboratorAddressAccess ) external; + // ------------------- METADATA URI ------------------- + /** * @notice Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. * @param collection Address of the collection @@ -274,622 +329,702 @@ interface IERC7508 is IERC165 { string memory attributesMetadataURI ) external; + // ------------------- GETTERS ------------------- + /** - * @notice Used to set a number attribute. - * @dev Emits a {UintAttributeUpdated} event. - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the address type token attributes. + * @param collection The collection address * @param tokenId The token ID - * @param key The attribute key - * @param value The attribute value + * @param key The key of the attribute + * @return attribute The value of the address attribute */ - function setUintAttribute( + function getAddressAttribute( address collection, uint256 tokenId, - string memory key, - uint256 value - ) external; + string memory key + ) external view returns (address attribute); /** - * @notice Used to set a string attribute. - * @dev Emits a {StringAttributeUpdated} event. - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the bool type token attributes. + * @param collection The collection address * @param tokenId The token ID - * @param key The attribute key - * @param value The attribute value + * @param key The key of the attribute + * @return attribute The value of the bool attribute */ - function setStringAttribute( + function getBoolAttribute( address collection, uint256 tokenId, - string memory key, - string memory value - ) external; + string memory key + ) external view returns (bool attribute); /** - * @notice Used to set a boolean attribute. - * @dev Emits a {BoolAttributeUpdated} event. - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the bytes type token attributes. + * @param collection The collection address * @param tokenId The token ID - * @param key The attribute key - * @param value The attribute value + * @param key The key of the attribute + * @return attribute The value of the bytes attribute */ - function setBoolAttribute( + function getBytesAttribute( address collection, uint256 tokenId, - string memory key, - bool value - ) external; + string memory key + ) external view returns (bytes memory attribute); /** - * @notice Used to set an bytes attribute. - * @dev Emits a {BytesAttributeUpdated} event. - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the uint type token attributes. + * @param collection The collection address * @param tokenId The token ID - * @param key The attribute key - * @param value The attribute value + * @param key The key of the attribute + * @return attribute The value of the uint attribute */ - function setBytesAttribute( + function getUintAttribute( address collection, uint256 tokenId, - string memory key, - bytes memory value - ) external; + string memory key + ) external view returns (uint256 attribute); + /** + * @notice Used to retrieve the string type token attributes. + * @param collection The collection address + * @param tokenId The token ID + * @param key The key of the attribute + * @return attribute The value of the string attribute + */ + function getStringAttribute( + address collection, + uint256 tokenId, + string memory key + ) external view returns (string memory attribute); /** - * @notice Used to set an address attribute. - * @dev Emits a {AddressAttributeUpdated} event. - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the int type token attributes. + * @param collection The collection address * @param tokenId The token ID - * @param key The attribute key - * @param value The attribute value + * @param key The key of the attribute + * @return attribute The value of the uint attribute */ - function setAddressAttribute( + function getIntAttribute( address collection, uint256 tokenId, - string memory key, - address value - ) external; + string memory key + ) external view returns (int256 attribute); + + // ------------------- BATCH GETTERS ------------------- /** - * @notice Sets multiple string attributes for a token at once. - * @dev The `StringAttribute` struct contains the following fields: + * @notice Used to get multiple address parameter values for a token. + * @dev The `AddressAttribute` struct contains the following fields: * [ - * string key, - * string value + * string key, + * address value * ] - * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributes An array of `StringAttribute` structs to be assigned to the given token + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of address keys to retrieve + * @return attributes An array of addresses, in the same order as the attribute keys */ - function setStringAttributes( + function getAddressAttributes( address[] memory collections, uint256[] memory tokenIds, - StringAttribute[] memory attributes - ) external; + string[] memory attributeKeys + ) external view returns (address[] memory attributes); /** - * @notice Sets multiple uint attributes for a token at once. - * @dev The `UintAttribute` struct contains the following fields: + * @notice Used to get multiple bool parameter values for a token. + * @dev The `BoolAttribute` struct contains the following fields: * [ - * string key, - * uint value + * string key, + * bool value * ] - * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributes An array of `UintAttribute` structs to be assigned to the given token + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of bool keys to retrieve + * @return attributes An array of bools, in the same order as the attribute keys */ - function setUintAttributes( + function getBoolAttributes( address[] memory collections, uint256[] memory tokenIds, - UintAttribute[] memory attributes - ) external; + string[] memory attributeKeys + ) external view returns (bool[] memory attributes); /** - * @notice Sets multiple bool attributes for a token at once. - * @dev The `BoolAttribute` struct contains the following fields: + * @notice Used to get multiple bytes parameter values for a token. + * @dev The `BytesAttribute` struct contains the following fields: * [ - * string key, - * bool value + * string key, + * bytes value * ] - * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributes An array of `BoolAttribute` structs to be assigned to the given token + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of bytes keys to retrieve + * @return attributes An array of bytes, in the same order as the attribute keys */ - function setBoolAttributes( + function getBytesAttributes( address[] memory collections, uint256[] memory tokenIds, - BoolAttribute[] memory attributes - ) external; + string[] memory attributeKeys + ) external view returns (bytes[] memory attributes); /** - * @notice Sets multiple address attributes for a token at once. - * @dev The `AddressAttribute` struct contains the following fields: - * [ - * string key, - * address value - * ] - * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributes An array of `AddressAttribute` structs to be assigned to the given token + * @notice Used to get multiple int parameter values for a token. + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of int keys to retrieve + * @return attributes An array of ints, in the same order as the attribute keys */ - function setAddressAttributes( + function getIntAttributes( address[] memory collections, uint256[] memory tokenIds, - AddressAttribute[] memory attributes - ) external; + string[] memory attributeKeys + ) external view returns (int256[] memory attributes); /** - * @notice Sets multiple bytes attributes for a token at once. - * @dev The `BytesAttribute` struct contains the following fields: - * [ - * string key, - * bytes value - * ] - * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributes An array of `BytesAttribute` structs to be assigned to the given token + * @notice Used to get multiple sting parameter values for a token. + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of string keys to retrieve + * @return attributes An array of strings, in the same order as the attribute keys */ - function setBytesAttributes( + function getStringAttributes( address[] memory collections, uint256[] memory tokenIds, - BytesAttribute[] memory attributes - ) external; + string[] memory attributeKeys + ) external view returns (string[] memory attributes); /** - * @notice Sets multiple attributes of multiple types for a token at the same time. - * @dev Emits a separate event for each attribute set. - * @dev The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists + * @notice Used to get multiple uint parameter values for a token. + * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributeKeys An array of uint keys to retrieve + * @return attributes An array of uints, in the same order as the attribute keys + */ + function getUintAttributes( + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys + ) external view returns (uint256[] memory attributes); + + /** + * @notice Used to retrieve multiple token attributes of any type at once. + * @dev The `StringAttribute`, `UintAttribute`, `IntAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists * to the following fields (where `value` is of the appropriate type): * [ * key, * value, * ] - * @param collection The address of the collection + * @param collection The collection address * @param tokenId The token ID - * @param stringAttributes An array of `StringAttribute` structs containing string attributes to set - * @param uintAttributes An array of `UintAttribute` structs containing uint attributes to set - * @param boolAttributes An array of `BoolAttribute` structs containing bool attributes to set - * @param addressAttributes An array of `AddressAttribute` structs containing address attributes to set - * @param bytesAttributes An array of `BytesAttribute` structs containing bytes attributes to set + * @param addressKeys An array of address type attribute keys to retrieve + * @param boolKeys An array of bool type attribute keys to retrieve + * @param bytesKeys An array of bytes type attribute keys to retrieve + * @param intKeys An array of int type attribute keys to retrieve + * @param stringKeys An array of string type attribute keys to retrieve + * @param uintKeys An array of uint type attribute keys to retrieve + * @return addressAttributes An array of addresses, in the same order as the addressKeys + * @return boolAttributes An array of bools, in the same order as the boolKeys + * @return bytesAttributes An array of bytes, in the same order as the bytesKeys + * @return intAttributes An array of ints, in the same order as the intKeys + * @return stringAttributes An array of strings, in the same order as the stringKeys + * @return uintAttributes An array of uints, in the same order as the uintKeys */ - function setAttributes( + function getAttributes( address collection, uint256 tokenId, - StringAttribute[] memory stringAttributes, - UintAttribute[] memory uintAttributes, - BoolAttribute[] memory boolAttributes, - AddressAttribute[] memory addressAttributes, - BytesAttribute[] memory bytesAttributes - ) external; + string[] memory addressKeys, + string[] memory boolKeys, + string[] memory bytesKeys, + string[] memory intKeys, + string[] memory stringKeys, + string[] memory uintKeys + ) + external + view + returns ( + address[] memory addressAttributes, + bool[] memory boolAttributes, + bytes[] memory bytesAttributes, + int256[] memory intAttributes, + string[] memory stringAttributes, + uint256[] memory uintAttributes + ); + + // ------------------- PREPARE PRESIGNED MESSAGES ------------------- /** - * @notice Used to set the uint attribute on behalf of an authorized account. - * @dev Emits a {UintAttributeUpdated} event. - * @param setter Address of the account that presigned the attribute change - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the message to be signed for submitting a presigned address attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction - * @param v `v` value of an ECDSA signature of the presigned message - * @param r `r` value of an ECDSA signature of the presigned message - * @param s `s` value of an ECDSA signature of the presigned message + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function presignedSetUintAttribute( - address setter, + function prepareMessageToPresignAddressAttribute( address collection, uint256 tokenId, string memory key, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; + address value, + uint256 deadline + ) external view returns (bytes32 message); /** - * @notice Used to set the string attribute on behalf of an authorized account. - * @dev Emits a {StringAttributeUpdated} event. - * @param setter Address of the account that presigned the attribute change - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the message to be signed for submitting a presigned bool attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction - * @param v `v` value of an ECDSA signature of the presigned message - * @param r `r` value of an ECDSA signature of the presigned message - * @param s `s` value of an ECDSA signature of the presigned message + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function presignedSetStringAttribute( - address setter, + function prepareMessageToPresignBoolAttribute( address collection, uint256 tokenId, string memory key, - string memory value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; + bool value, + uint256 deadline + ) external view returns (bytes32 message); /** - * @notice Used to set the bool attribute on behalf of an authorized account. - * @dev Emits a {BoolAttributeUpdated} event. - * @param setter Address of the account that presigned the attribute change - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the message to be signed for submitting a presigned bytes attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction - * @param v `v` value of an ECDSA signature of the presigned message - * @param r `r` value of an ECDSA signature of the presigned message - * @param s `s` value of an ECDSA signature of the presigned message + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function presignedSetBoolAttribute( - address setter, + function prepareMessageToPresignBytesAttribute( address collection, uint256 tokenId, string memory key, - bool value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; + bytes memory value, + uint256 deadline + ) external view returns (bytes32 message); /** - * @notice Used to set the bytes attribute on behalf of an authorized account. - * @dev Emits a {BytesAttributeUpdated} event. - * @param setter Address of the account that presigned the attribute change - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the message to be signed for submitting a presigned int attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction - * @param v `v` value of an ECDSA signature of the presigned message - * @param r `r` value of an ECDSA signature of the presigned message - * @param s `s` value of an ECDSA signature of the presigned message + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function presignedSetBytesAttribute( - address setter, + function prepareMessageToPresignIntAttribute( address collection, uint256 tokenId, string memory key, - bytes memory value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; + int256 value, + uint256 deadline + ) external view returns (bytes32 message); /** - * @notice Used to set the address attribute on behalf of an authorized account. - * @dev Emits a {AddressAttributeUpdated} event. - * @param setter Address of the account that presigned the attribute change - * @param collection Address of the collection receiving the attribute + * @notice Used to retrieve the message to be signed for submitting a presigned string attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction - * @param v `v` value of an ECDSA signature of the presigned message - * @param r `r` value of an ECDSA signature of the presigned message - * @param s `s` value of an ECDSA signature of the presigned message + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function presignedSetAddressAttribute( - address setter, + function prepareMessageToPresignStringAttribute( address collection, uint256 tokenId, string memory key, - address value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @notice Used to check if the specified address is listed as a collaborator of the given collection's parameter. - * @param collaborator Address to be checked. - * @param collection Address of the collection. - * @return isCollaborator_ Boolean value indicating if the address is a collaborator of the given collection's (`true`) or not - * (`false`). - */ - function isCollaborator( - address collaborator, - address collection - ) external view returns (bool isCollaborator_); + string memory value, + uint256 deadline + ) external view returns (bytes32 message); /** - * @notice Used to check if the specified address is listed as a specific address of the given collection's - * parameter. - * @param specificAddress Address to be checked. - * @param collection Address of the collection. - * @param key The key of the attribute - * @return isSpecificAddress_ Boolean value indicating if the address is a specific address of the given collection's parameter - * (`true`) or not (`false`). + * @notice Used to retrieve the message to be signed for submitting a presigned uint attribute change. + * @param collection The address of the collection smart contract of the token receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid + * @return message Raw message to be signed by the authorized account */ - function isSpecificAddress( - address specificAddress, + function prepareMessageToPresignUintAttribute( address collection, - string memory key - ) external view returns (bool isSpecificAddress_); + uint256 tokenId, + string memory key, + uint256 value, + uint256 deadline + ) external view returns (bytes32 message); + + // ------------------- SETTERS ------------------- /** - * @notice Used to retrieve the string type token attributes. - * @param collection The collection address + * @notice Used to set an address attribute. + * @dev Emits a {AddressAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute * @param tokenId The token ID - * @param key The key of the attribute - * @return attribute The value of the string attribute + * @param key The attribute key + * @param value The attribute value */ - function getStringAttribute( + function setAddressAttribute( address collection, uint256 tokenId, - string memory key - ) external view returns (string memory attribute); - - /** - * @notice Used to retrieve the uint type token attributes. - * @param collection The collection address - * @param tokenId The token ID - * @param key The key of the attribute - * @return attribute The value of the uint attribute - */ - function getUintAttribute( - address collection, - uint256 tokenId, - string memory key - ) external view returns (uint256 attribute); - - /** - * @notice Used to retrieve the bool type token attributes. - * @param collection The collection address - * @param tokenId The token ID - * @param key The key of the attribute - * @return attribute The value of the bool attribute - */ - function getBoolAttribute( - address collection, - uint256 tokenId, - string memory key - ) external view returns (bool attribute); - - /** - * @notice Used to retrieve the address type token attributes. - * @param collection The collection address - * @param tokenId The token ID - * @param key The key of the attribute - * @return attribute The value of the address attribute - */ - function getAddressAttribute( - address collection, - uint256 tokenId, - string memory key - ) external view returns (address attribute); + string memory key, + address value + ) external; /** - * @notice Used to retrieve the bytes type token attributes. - * @param collection The collection address + * @notice Used to set a boolean attribute. + * @dev Emits a {BoolAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute * @param tokenId The token ID - * @param key The key of the attribute - * @return attribute The value of the bytes attribute - */ - function getBytesAttribute( - address collection, - uint256 tokenId, - string memory key - ) external view returns (bytes memory attribute); - - /** - * @notice Used to retrieve the message to be signed for submitting a presigned uint attribute change. - * @param collection The address of the collection smart contract of the token receiving the attribute - * @param tokenId The ID of the token receiving the attribute * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid - * @return message Raw message to be signed by the authorized account */ - function prepareMessageToPresignUintAttribute( + function setBoolAttribute( address collection, uint256 tokenId, string memory key, - uint256 value, - uint256 deadline - ) external view returns (bytes32 message); + bool value + ) external; /** - * @notice Used to retrieve the message to be signed for submitting a presigned string attribute change. - * @param collection The address of the collection smart contract of the token receiving the attribute - * @param tokenId The ID of the token receiving the attribute + * @notice Used to set an bytes attribute. + * @dev Emits a {BytesAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute + * @param tokenId The token ID * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid - * @return message Raw message to be signed by the authorized account */ - function prepareMessageToPresignStringAttribute( + function setBytesAttribute( address collection, uint256 tokenId, string memory key, - string memory value, - uint256 deadline - ) external view returns (bytes32 message); + bytes memory value + ) external; /** - * @notice Used to retrieve the message to be signed for submitting a presigned bool attribute change. - * @param collection The address of the collection smart contract of the token receiving the attribute - * @param tokenId The ID of the token receiving the attribute + * @notice Used to set a signed number attribute. + * @dev Emits a {IntAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute + * @param tokenId The token ID * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid - * @return message Raw message to be signed by the authorized account */ - function prepareMessageToPresignBoolAttribute( + function setIntAttribute( address collection, uint256 tokenId, string memory key, - bool value, - uint256 deadline - ) external view returns (bytes32 message); + int256 value + ) external; /** - * @notice Used to retrieve the message to be signed for submitting a presigned bytes attribute change. - * @param collection The address of the collection smart contract of the token receiving the attribute - * @param tokenId The ID of the token receiving the attribute + * @notice Used to set a string attribute. + * @dev Emits a {StringAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute + * @param tokenId The token ID * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid - * @return message Raw message to be signed by the authorized account */ - function prepareMessageToPresignBytesAttribute( + function setStringAttribute( address collection, uint256 tokenId, string memory key, - bytes memory value, - uint256 deadline - ) external view returns (bytes32 message); + string memory value + ) external; /** - * @notice Used to retrieve the message to be signed for submitting a presigned address attribute change. - * @param collection The address of the collection smart contract of the token receiving the attribute - * @param tokenId The ID of the token receiving the attribute + * @notice Used to set an unsigned number attribute. + * @dev Emits a {UintAttributeUpdated} event. + * @param collection Address of the collection receiving the attribute + * @param tokenId The token ID * @param key The attribute key * @param value The attribute value - * @param deadline The deadline timestamp for the presigned transaction after which the message is invalid - * @return message Raw message to be signed by the authorized account */ - function prepareMessageToPresignAddressAttribute( + function setUintAttribute( address collection, uint256 tokenId, string memory key, - address value, - uint256 deadline - ) external view returns (bytes32 message); + uint256 value + ) external; + + // ------------------- BATCH SETTERS ------------------- /** - * @notice Used to retrieve multiple token attributes of any type at once. - * @dev The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists - * to the following fields (where `value` is of the appropriate type): + * @notice Sets multiple address attributes for a token at once. + * @dev The `AddressAttribute` struct contains the following fields: * [ - * key, - * value, + * string key, + * address value * ] - * @param collection The collection address - * @param tokenId The token ID - * @param stringKeys An array of string type attribute keys to retrieve - * @param uintKeys An array of uint type attribute keys to retrieve - * @param boolKeys An array of bool type attribute keys to retrieve - * @param addressKeys An array of address type attribute keys to retrieve - * @param bytesKeys An array of bytes type attribute keys to retrieve - * @return stringAttributes An array of strings, in the same order as the stringKeys - * @return uintAttributes An array of uints, in the same order as the uintKeys - * @return boolAttributes An array of bools, in the same order as the boolKeys - * @return addressAttributes An array of addresses, in the same order as the addressKeys - * @return bytesAttributes An array of bytes, in the same order as the bytesKeys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `AddressAttribute` structs to be assigned to the given token */ - function getAttributes( - address collection, - uint256 tokenId, - string[] memory stringKeys, - string[] memory uintKeys, - string[] memory boolKeys, - string[] memory addressKeys, - string[] memory bytesKeys - ) - external - view - returns ( - string[] memory stringAttributes, - uint256[] memory uintAttributes, - bool[] memory boolAttributes, - address[] memory addressAttributes, - bytes[] memory bytesAttributes - ); + function setAddressAttributes( + address[] memory collections, + uint256[] memory tokenIds, + AddressAttribute[] memory attributes + ) external; /** - * @notice Used to get multiple sting parameter values for a token. - * @dev The `StringAttribute` struct contains the following fields: + * @notice Sets multiple bool attributes for a token at once. + * @dev The `BoolAttribute` struct contains the following fields: * [ - * string key, - * string value + * string key, + * bool value * ] - * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributeKeys An array of string keys to retrieve - * @return attributes An array of strings, in the same order as the attribute keys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `BoolAttribute` structs to be assigned to the given token */ - function getStringAttributes( + function setBoolAttributes( address[] memory collections, uint256[] memory tokenIds, - string[] memory attributeKeys - ) external view returns (string[] memory attributes); + BoolAttribute[] memory attributes + ) external; /** - * @notice Used to get multiple uint parameter values for a token. - * @dev The `UintAttribute` struct contains the following fields: + * @notice Sets multiple bytes attributes for a token at once. + * @dev The `BytesAttribute` struct contains the following fields: * [ - * string key, - * uint value + * string key, + * bytes value * ] - * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributeKeys An array of uint keys to retrieve - * @return attributes An array of uints, in the same order as the attribute keys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `BytesAttribute` structs to be assigned to the given token */ - function getUintAttributes( + function setBytesAttributes( address[] memory collections, uint256[] memory tokenIds, - string[] memory attributeKeys - ) external view returns (uint256[] memory attributes); + BytesAttribute[] memory attributes + ) external; /** - * @notice Used to get multiple bool parameter values for a token. - * @dev The `BoolAttribute` struct contains the following fields: + * @notice Sets multiple int attributes for a token at once. + * @dev The `UintAttribute` struct contains the following fields: * [ - * string key, - * bool value + * string key, + * int value * ] - * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributeKeys An array of bool keys to retrieve - * @return attributes An array of bools, in the same order as the attribute keys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `IntAttribute` structs to be assigned to the given token */ - function getBoolAttributes( + function setIntAttributes( address[] memory collections, uint256[] memory tokenIds, - string[] memory attributeKeys - ) external view returns (bool[] memory attributes); + IntAttribute[] memory attributes + ) external; /** - * @notice Used to get multiple address parameter values for a token. - * @dev The `AddressAttribute` struct contains the following fields: + * @notice Sets multiple string attributes for a token at once. + * @dev The `StringAttribute` struct contains the following fields: * [ - * string key, - * address value + * string key, + * string value * ] - * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributeKeys An array of address keys to retrieve - * @return attributes An array of addresses, in the same order as the attribute keys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `StringAttribute` structs to be assigned to the given token */ - function getAddressAttributes( + function setStringAttributes( address[] memory collections, uint256[] memory tokenIds, - string[] memory attributeKeys - ) external view returns (address[] memory attributes); + StringAttribute[] memory attributes + ) external; /** - * @notice Used to get multiple bytes parameter values for a token. - * @dev The `BytesAttribute` struct contains the following fields: + * @notice Sets multiple uint attributes for a token at once. + * @dev The `UintAttribute` struct contains the following fields: * [ - * string key, - * bytes value + * string key, + * uint value * ] - * @param collections Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. - * @param tokenIds IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. - * @param attributeKeys An array of bytes keys to retrieve - * @return attributes An array of bytes, in the same order as the attribute keys + * @param collections Addresses of the collections, in the same order as the attributes. If all tokens are from the same collection the array can contain a single element with the collection address. + * @param tokenIds IDs of the tokens, in the same order as the attributes. If all attributes are for the same token the array can contain a single element with the token ID. + * @param attributes An array of `UintAttribute` structs to be assigned to the given token */ - function getBytesAttributes( + function setUintAttributes( address[] memory collections, uint256[] memory tokenIds, - string[] memory attributeKeys - ) external view returns (bytes[] memory attributes); + UintAttribute[] memory attributes + ) external; + + /** + * @notice Sets multiple attributes of multiple types for a token at the same time. + * @dev Emits a separate event for each attribute set. + * @dev The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists + * to the following fields (where `value` is of the appropriate type): + * [ + * key, + * value, + * ] + * @param collection The address of the collection + * @param tokenId The token ID + * @param addressAttributes An array of `AddressAttribute` structs containing address attributes to set + * @param boolAttributes An array of `BoolAttribute` structs containing bool attributes to set + * @param bytesAttributes An array of `BytesAttribute` structs containing bytes attributes to set + * @param intAttributes An array of `IntAttribute` structs containing int attributes to set + * @param stringAttributes An array of `StringAttribute` structs containing string attributes to set + * @param uintAttributes An array of `UintAttribute` structs containing uint attributes to set + */ + function setAttributes( + address collection, + uint256 tokenId, + AddressAttribute[] memory addressAttributes, + BoolAttribute[] memory boolAttributes, + BytesAttribute[] memory bytesAttributes, + IntAttribute[] memory intAttributes, + StringAttribute[] memory stringAttributes, + UintAttribute[] memory uintAttributes + ) external; + + // ------------------- PRESIGNED SETTERS ------------------- + + /** + * @notice Used to set the address attribute on behalf of an authorized account. + * @dev Emits a {AddressAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetAddressAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + address value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Used to set the bool attribute on behalf of an authorized account. + * @dev Emits a {BoolAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetBoolAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + bool value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Used to set the bytes attribute on behalf of an authorized account. + * @dev Emits a {BytesAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetBytesAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + bytes memory value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Used to set the int attribute on behalf of an authorized account. + * @dev Emits a {IntAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetIntAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + int256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Used to set the string attribute on behalf of an authorized account. + * @dev Emits a {StringAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetStringAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + string memory value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @notice Used to set the uint attribute on behalf of an authorized account. + * @dev Emits a {UintAttributeUpdated} event. + * @param setter Address of the account that presigned the attribute change + * @param collection Address of the collection receiving the attribute + * @param tokenId The ID of the token receiving the attribute + * @param key The attribute key + * @param value The attribute value + * @param deadline The deadline timestamp for the presigned transaction + * @param v `v` value of an ECDSA signature of the presigned message + * @param r `r` value of an ECDSA signature of the presigned message + * @param s `s` value of an ECDSA signature of the presigned message + */ + function presignedSetUintAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; } diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index f1711765..4f4f693e 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -27,6 +27,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( "setUintAttribute(address collection,uint256 tokenId,string memory key,uint256 value)" ); + bytes32 public immutable SET_INT_ATTRIBUTE_TYPEHASH = + keccak256( + "setUintAttribute(address collection,uint256 tokenId,string memory key,int256 value)" + ); bytes32 public immutable SET_STRING_ATTRIBUTE_TYPEHASH = keccak256( "setStringAttribute(address collection,uint256 tokenId,string memory key,string memory value)" @@ -66,6 +70,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { private _bytesValues; mapping(address collection => mapping(uint256 => mapping(uint256 => uint256))) private _uintValues; + mapping(address collection => mapping(uint256 => mapping(uint256 => int256))) + private _intValues; mapping(address collection => mapping(uint256 => mapping(uint256 => bool))) private _boolValues; mapping(address collection => mapping(uint256 => mapping(uint256 => string))) @@ -341,6 +347,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attribute = _uintValues[collection][tokenId][_keysToIds[key]]; } + /** + * @inheritdoc IERC7508 + */ + function getIntAttribute( + address collection, + uint256 tokenId, + string memory key + ) public view returns (int256 attribute) { + attribute = _intValues[collection][tokenId][_keysToIds[key]]; + } + /** * @inheritdoc IERC7508 */ @@ -380,40 +397,92 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { function getAttributes( address collection, uint256 tokenId, - string[] memory stringKeys, - string[] memory uintKeys, - string[] memory boolKeys, string[] memory addressKeys, - string[] memory bytesKeys + string[] memory boolKeys, + string[] memory bytesKeys, + string[] memory intKeys, + string[] memory stringKeys, + string[] memory uintKeys ) external view returns ( - string[] memory stringAttributes, - uint256[] memory uintAttributes, - bool[] memory boolAttributes, address[] memory addressAttributes, - bytes[] memory bytesAttributes + bool[] memory boolAttributes, + bytes[] memory bytesAttributes, + int256[] memory intAttributes, + string[] memory stringAttributes, + uint256[] memory uintAttributes ) { - address[] memory collections = new address[](1); - uint256[] memory tokenIds = new uint256[](1); - collections[0] = collection; - tokenIds[0] = tokenId; - - stringAttributes = getStringAttributes( - collections, - tokenIds, - stringKeys - ); - uintAttributes = getUintAttributes(collections, tokenIds, uintKeys); - boolAttributes = getBoolAttributes(collections, tokenIds, boolKeys); - addressAttributes = getAddressAttributes( - collections, - tokenIds, - addressKeys - ); - bytesAttributes = getBytesAttributes(collections, tokenIds, bytesKeys); + // WARNING: This implementation is a bit inneficient and differs slightly from the ERC one, to avoid stack too deep errors without using via-IR flag which would affect all other contracts in the package. This is not relevant since you should only need the interface to interact with the actual repo on each network anyway. + stringAttributes = new string[](stringKeys.length); + for (uint256 i; i < stringKeys.length; ) { + stringAttributes[i] = getStringAttribute( + collection, + tokenId, + stringKeys[i] + ); + unchecked { + ++i; + } + } + + uintAttributes = new uint256[](uintKeys.length); + for (uint256 i; i < uintKeys.length; ) { + uintAttributes[i] = getUintAttribute( + collection, + tokenId, + uintKeys[i] + ); + unchecked { + ++i; + } + } + + intAttributes = new int256[](intKeys.length); + for (uint256 i; i < intKeys.length; ) { + intAttributes[i] = getIntAttribute(collection, tokenId, intKeys[i]); + unchecked { + ++i; + } + } + + boolAttributes = new bool[](boolKeys.length); + for (uint256 i; i < boolKeys.length; ) { + boolAttributes[i] = getBoolAttribute( + collection, + tokenId, + boolKeys[i] + ); + unchecked { + ++i; + } + } + + addressAttributes = new address[](addressKeys.length); + for (uint256 i; i < addressKeys.length; ) { + addressAttributes[i] = getAddressAttribute( + collection, + tokenId, + addressKeys[i] + ); + unchecked { + ++i; + } + } + + bytesAttributes = new bytes[](bytesKeys.length); + for (uint256 i; i < bytesKeys.length; ) { + bytesAttributes[i] = getBytesAttribute( + collection, + tokenId, + bytesKeys[i] + ); + unchecked { + ++i; + } + } } /** @@ -482,6 +551,39 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + /** + * @inheritdoc IERC7508 + */ + function getIntAttributes( + address[] memory collections, + uint256[] memory tokenIds, + string[] memory attributeKeys + ) public view returns (int256[] memory attributes) { + ( + bool multipleCollections, + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributeKeys.length + ); + + attributes = new int256[](loopLength); + + for (uint256 i; i < loopLength; ) { + attributes[i] = getIntAttribute( + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + multipleAttributes ? attributeKeys[i] : attributeKeys[0] + ); + unchecked { + ++i; + } + } + } + /** * @inheritdoc IERC7508 */ @@ -604,6 +706,29 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ); } + /** + * @inheritdoc IERC7508 + */ + function prepareMessageToPresignIntAttribute( + address collection, + uint256 tokenId, + string memory key, + int256 value, + uint256 deadline + ) public view returns (bytes32 message) { + message = keccak256( + abi.encode( + DOMAIN_SEPARATOR, + SET_UINT_ATTRIBUTE_TYPEHASH, + collection, + tokenId, + key, + value, + deadline + ) + ); + } + /** * @inheritdoc IERC7508 */ @@ -744,6 +869,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { _setUintAttribute(_msgSender(), collection, tokenId, key, value); } + /** + * @inheritdoc IERC7508 + */ + function setIntAttribute( + address collection, + uint256 tokenId, + string memory key, + int256 value + ) external { + _setIntAttribute(_msgSender(), collection, tokenId, key, value); + } + /** * @inheritdoc IERC7508 */ @@ -896,6 +1033,41 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + /** + * @inheritdoc IERC7508 + */ + function setIntAttributes( + address[] memory collections, + uint256[] memory tokenIds, + IntAttribute[] memory attributes + ) external { + ( + bool multipleCollections, + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) = _checkIfMultipleCollectionsAndTokens( + collections, + tokenIds, + attributes.length + ); + for (uint256 i; i < loopLength; ) { + IntAttribute memory attribute = multipleAttributes + ? attributes[i] + : attributes[0]; + _setIntAttribute( + _msgSender(), + multipleCollections ? collections[i] : collections[0], + multipleTokens ? tokenIds[i] : tokenIds[0], + attribute.key, + attribute.value + ); + unchecked { + ++i; + } + } + } + /** * @inheritdoc IERC7508 */ @@ -937,11 +1109,12 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { function setAttributes( address collection, uint256 tokenId, - StringAttribute[] memory stringAttributes, - UintAttribute[] memory uintAttributes, - BoolAttribute[] memory boolAttributes, AddressAttribute[] memory addressAttributes, - BytesAttribute[] memory bytesAttributes + BoolAttribute[] memory boolAttributes, + BytesAttribute[] memory bytesAttributes, + IntAttribute[] memory intAttributes, + StringAttribute[] memory stringAttributes, + UintAttribute[] memory uintAttributes ) external { uint256 length = stringAttributes.length; for (uint256 i; i < length; ) { @@ -971,6 +1144,20 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + length = intAttributes.length; + for (uint256 i; i < length; ) { + _setIntAttribute( + _msgSender(), + collection, + tokenId, + intAttributes[i].key, + intAttributes[i].value + ); + unchecked { + ++i; + } + } + length = boolAttributes.length; for (uint256 i; i < length; ) { _setBoolAttribute( @@ -1114,6 +1301,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { emit UintAttributeUpdated(collection, tokenId, key, value); } + function _setIntAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + int256 value + ) internal { + _onlyAuthorizedCaller(caller, collection, key, tokenId); + _intValues[collection][tokenId][_getIdForKey(key)] = value; + emit IntAttributeUpdated(collection, tokenId, key, value); + } + /** * @inheritdoc IERC7508 */ @@ -1148,6 +1347,40 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { _setUintAttribute(setter, collection, tokenId, key, value); } + /** + * @inheritdoc IERC7508 + */ + function presignedSetIntAttribute( + address setter, + address collection, + uint256 tokenId, + string memory key, + int256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + bytes32 digest = keccak256( + abi.encodePacked( + "\x19Ethereum Signed Message:\n32", + keccak256( + abi.encode( + DOMAIN_SEPARATOR, + SET_UINT_ATTRIBUTE_TYPEHASH, + collection, + tokenId, + key, + value, + deadline + ) + ) + ) + ); + _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); + _setIntAttribute(setter, collection, tokenId, key, value); + } + /** * @inheritdoc IERC7508 */ diff --git a/hardhat.config.ts b/hardhat.config.ts index 338ffd93..9a241fcc 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -22,6 +22,7 @@ const config: HardhatUserConfig = { solidity: { version: '0.8.21', settings: { + // viaIR: true, evmVersion: 'london', optimizer: { enabled: true, diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 53c7c4d9..1f73b8d4 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -54,7 +54,7 @@ describe('RMRKTokenAttributesRepository', async function () { this.ownedCollection = ownedCollection; }); - shouldBehaveLikeTokenAttributesRepositoryInterface(); + shouldBehaveLikeAttributesRepositoryInterface(); describe('Registering attributes and setting values', async function () { beforeEach(async function () { @@ -66,53 +66,59 @@ describe('RMRKTokenAttributesRepository', async function () { }); it('can set and get token attributes', async function () { - expect( - await tokenAttributes.setStringAttribute( + await expect( + tokenAttributes.setStringAttribute( collectionAddress, tokenId, 'description', 'test description', ), ) - .to.emit(tokenAttributes, 'StringAttributeSet') + .to.emit(tokenAttributes, 'StringAttributeUpdated') .withArgs(collectionAddress, tokenId, 'description', 'test description'); - expect( - await tokenAttributes.setStringAttribute( + await expect( + tokenAttributes.setStringAttribute( collectionAddress, tokenId, 'description1', 'test description', ), ) - .to.emit(tokenAttributes, 'StringAttributeSet') + .to.emit(tokenAttributes, 'StringAttributeUpdated') .withArgs(collectionAddress, tokenId, 'description1', 'test description'); - expect(await tokenAttributes.setBoolAttribute(collectionAddress, tokenId, 'rare', true)) - .to.emit(tokenAttributes, 'BoolAttributeSet') + await expect(tokenAttributes.setBoolAttribute(collectionAddress, tokenId, 'rare', true)) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') .withArgs(collectionAddress, tokenId, 'rare', true); - expect( - await tokenAttributes.setAddressAttribute( + await expect( + tokenAttributes.setAddressAttribute( collectionAddress, tokenId, 'owner', tokenOwner.address, ), ) - .to.emit(tokenAttributes, 'AddressAttributeSet') + .to.emit(tokenAttributes, 'AddressAttributeUpdated') .withArgs(collectionAddress, tokenId, 'owner', tokenOwner.address); - expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'atk', 100n)) - .to.emit(tokenAttributes, 'UintAttributeSet') + await expect(tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'atk', 100n)) + .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, tokenId, 'atk', 100n); - expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 100n)) - .to.emit(tokenAttributes, 'UintAttributeSet') + await expect(tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 100n)) + .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, tokenId, 'health', 100n); - expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 95n)) - .to.emit(tokenAttributes, 'UintAttributeSet') + await expect(tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 95n)) + .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, tokenId, 'health', 95n); - expect(await tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 80n)) - .to.emit(tokenAttributes, 'UintAttributeSet') + await expect(tokenAttributes.setUintAttribute(collectionAddress, tokenId, 'health', 80n)) + .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, tokenId, 'health', 80n); - expect(await tokenAttributes.setBytesAttribute(collectionAddress, tokenId, 'data', '0x1234')) - .to.emit(tokenAttributes, 'BytesAttributeSet') + await expect(tokenAttributes.setIntAttribute(collectionAddress, tokenId, 'int', 1n)) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int', 1n); + await expect(tokenAttributes.setIntAttribute(collectionAddress, tokenId, 'int2', -10n)) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int2', -10n); + await expect(tokenAttributes.setBytesAttribute(collectionAddress, tokenId, 'data', '0x1234')) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') .withArgs(collectionAddress, tokenId, 'data', '0x1234'); expect( @@ -133,6 +139,10 @@ describe('RMRKTokenAttributesRepository', async function () { expect(await tokenAttributes.getUintAttribute(collectionAddress, tokenId, 'health')).to.eql( 80n, ); + expect(await tokenAttributes.getIntAttribute(collectionAddress, tokenId, 'int')).to.eql(1n); + expect(await tokenAttributes.getIntAttribute(collectionAddress, tokenId, 'int2')).to.eql( + -10n, + ); expect(await tokenAttributes.getBytesAttribute(collectionAddress, tokenId, 'data')).to.eql( '0x1234', ); @@ -154,79 +164,21 @@ describe('RMRKTokenAttributesRepository', async function () { collectionAddress, tokenId, [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: await collectionOwner.getAddress() }, ], [ { key: 'bool1', value: true }, { key: 'bool2', value: false }, ], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], [ { key: 'bytes1', value: '0x1234' }, { key: 'bytes2', value: '0x5678' }, ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string2', 'value2') - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint1', 1n) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint2', 2n) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); - }); - - it('can update multiple attributes of multiple types at the same time', async function () { - await tokenAttributes.setAttributes( - collectionAddress, - tokenId, - [ - { key: 'string1', value: 'value0' }, - { key: 'string2', value: 'value1' }, - ], - [ - { key: 'uint1', value: 0n }, - { key: 'uint2', value: 1n }, - ], - [ - { key: 'bool1', value: false }, - { key: 'bool2', value: true }, - ], - [ - { key: 'address1', value: await collectionOwner.getAddress() }, - { key: 'address2', value: tokenOwner.address }, - ], - [ - { key: 'bytes1', value: '0x5678' }, - { key: 'bytes2', value: '0x1234' }, - ], - ); - - await expect( - tokenAttributes.setAttributes( - collectionAddress, - tokenId, + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], [ { key: 'string1', value: 'value1' }, { key: 'string2', value: 'value2' }, @@ -235,18 +187,6 @@ describe('RMRKTokenAttributesRepository', async function () { { key: 'uint1', value: 1n }, { key: 'uint2', value: 2n }, ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], ), ) .to.emit(tokenAttributes, 'StringAttributeUpdated') @@ -257,6 +197,10 @@ describe('RMRKTokenAttributesRepository', async function () { .withArgs(collectionAddress, tokenId, 'uint1', 1n) .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, tokenId, 'uint2', 2n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int2', 2n) .to.emit(tokenAttributes, 'BoolAttributeUpdated') .withArgs(collectionAddress, tokenId, 'bool1', true) .to.emit(tokenAttributes, 'BoolAttributeUpdated') @@ -275,43 +219,45 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes.setAttributes( collectionAddress, tokenId, - [{ key: 'string1', value: 'value0' }], [ - { key: 'uint1', value: 0n }, - { key: 'uint2', value: 1n }, + { key: 'address1', value: await collectionOwner.getAddress() }, + { key: 'address2', value: tokenOwner.address }, ], [ { key: 'bool1', value: false }, { key: 'bool2', value: true }, ], + [], + [], + [{ key: 'string1', value: 'value0' }], [ - { key: 'address1', value: await collectionOwner.getAddress() }, - { key: 'address2', value: tokenOwner.address }, + { key: 'uint1', value: 0n }, + { key: 'uint2', value: 1n }, ], - [], ); await expect( tokenAttributes.setAttributes( collectionAddress, tokenId, - [], [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: await collectionOwner.getAddress() }, ], [ { key: 'bool1', value: true }, { key: 'bool2', value: false }, ], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], [ { key: 'bytes1', value: '0x1234' }, { key: 'bytes2', value: '0x5678' }, ], + [], + [], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], ), ) .to.emit(tokenAttributes, 'UintAttributeUpdated') @@ -336,13 +282,14 @@ describe('RMRKTokenAttributesRepository', async function () { collectionAddress, tokenId, [], - [], [ { key: 'bool1', value: false }, { key: 'bool2', value: true }, ], [], [], + [], + [], ), ) .to.emit(tokenAttributes, 'BoolAttributeUpdated') @@ -351,97 +298,54 @@ describe('RMRKTokenAttributesRepository', async function () { .withArgs(collectionAddress, tokenId, 'bool2', true); }); - it('can set and update multiple attributes of multiple types at the same time', async function () { - await expect( - tokenAttributes.setAttributes( - collectionAddress, - tokenId, - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, - ], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string2', 'value2') - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint1', 1n) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint2', 2n) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool2', false) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); - }); - it('should allow to retrieve multiple attributes at once', async function () { await tokenAttributes.setAttributes( collectionAddress, tokenId, [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: await collectionOwner.getAddress() }, ], [ { key: 'bool1', value: true }, { key: 'bool2', value: false }, ], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], [ { key: 'bytes1', value: '0x1234' }, { key: 'bytes2', value: '0x5678' }, ], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], ); expect( await tokenAttributes.getAttributes( collectionAddress, tokenId, - ['string1', 'string2'], - ['uint1', 'uint2'], - ['bool1', 'bool2'], ['address1', 'address2'], + ['bool1', 'bool2'], ['bytes1', 'bytes2'], + ['int1', 'int2'], + ['string1', 'string2'], + ['uint1', 'uint2'], ), ).to.eql([ - ['value1', 'value2'], - [1n, 2n], - [true, false], [tokenOwner.address, await collectionOwner.getAddress()], + [true, false], ['0x1234', '0x5678'], + [-10n, 2n], + ['value1', 'value2'], + [1n, 2n], ]); }); @@ -465,13 +369,14 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes.getAttributes( collectionAddress, tokenId, - ['string1', 'string2'], [], [], [], [], + ['string1', 'string2'], + [], ), - ).to.eql([['value1', 'value2'], [], [], [], []]); + ).to.eql([[], [], [], [], ['value1', 'value2'], []]); }); it('can set multiple uint attributes at the same time', async function () { @@ -495,12 +400,43 @@ describe('RMRKTokenAttributesRepository', async function () { collectionAddress, tokenId, [], + [], + [], + [], + [], ['uint1', 'uint2'], + ), + ).to.eql([[], [], [], [], [], [1n, 2n]]); + }); + + it('can set multiple int attributes at the same time', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int2', 2n); + + expect( + await tokenAttributes.getAttributes( + collectionAddress, + tokenId, + [], [], [], + ['int1', 'int2'], + [], [], ), - ).to.eql([[], [1n, 2n], [], [], []]); + ).to.eql([[], [], [], [-10n, 2n], [], []]); }); it('can set multiple bool attributes at the same time', async function () { @@ -524,12 +460,13 @@ describe('RMRKTokenAttributesRepository', async function () { collectionAddress, tokenId, [], - [], ['bool1', 'bool2'], [], [], + [], + [], ), - ).to.eql([[], [], [true, false], [], []]); + ).to.eql([[], [true, false], [], [], [], []]); }); it('can set multiple address attributes at the same time', async function () { @@ -552,13 +489,14 @@ describe('RMRKTokenAttributesRepository', async function () { await tokenAttributes.getAttributes( collectionAddress, tokenId, + ['address1', 'address2'], + [], [], [], [], - ['address1', 'address2'], [], ), - ).to.eql([[], [], [], [tokenOwner.address, await collectionOwner.getAddress()], []]); + ).to.eql([[tokenOwner.address, await collectionOwner.getAddress()], [], [], [], [], []]); }); it('can set multiple bytes attributes at the same time', async function () { @@ -583,11 +521,12 @@ describe('RMRKTokenAttributesRepository', async function () { tokenId, [], [], + ['bytes1', 'bytes2'], + [], [], [], - ['bytes1', 'bytes2'], ), - ).to.eql([[], [], [], [], ['0x1234', '0x5678']]); + ).to.eql([[], [], ['0x1234', '0x5678'], [], [], []]); }); it('can reuse keys and values are fine', async function () { @@ -1066,6 +1005,13 @@ describe('RMRKTokenAttributesRepository', async function () { 1, 9999999999n, ); + const intMessage = await tokenAttributes.prepareMessageToPresignIntAttribute( + collectionAddress, + tokenId, + 'X', + -10n, + 9999999999n, + ); const stringMessage = await tokenAttributes.prepareMessageToPresignStringAttribute( collectionAddress, tokenId, @@ -1096,6 +1042,7 @@ describe('RMRKTokenAttributesRepository', async function () { ); const uintSignature = await collectionOwner.signMessage(ethers.getBytes(uintMessage)); + const intSignature = await collectionOwner.signMessage(ethers.getBytes(intMessage)); const stringSignature = await collectionOwner.signMessage(ethers.getBytes(stringMessage)); const boolSignature = await collectionOwner.signMessage(ethers.getBytes(boolMessage)); const bytesSignature = await collectionOwner.signMessage(ethers.getBytes(bytesMessage)); @@ -1105,6 +1052,10 @@ describe('RMRKTokenAttributesRepository', async function () { const uintS: string = '0x' + uintSignature.substring(66, 130); const uintV: string = parseInt(uintSignature.substring(130, 132), 16).toString(); + const intR: string = intSignature.substring(0, 66); + const intS: string = '0x' + intSignature.substring(66, 130); + const intV: string = parseInt(intSignature.substring(130, 132), 16).toString(); + const stringR: string = stringSignature.substring(0, 66); const stringS: string = '0x' + stringSignature.substring(66, 130); const stringV: string = parseInt(stringSignature.substring(130, 132), 16).toString(); @@ -1138,6 +1089,24 @@ describe('RMRKTokenAttributesRepository', async function () { ) .to.emit(tokenAttributes, 'UintAttributeUpdated') .withArgs(collectionAddress, 1, 'X', 1); + + await expect( + tokenAttributes + .connect(tokenOwner) + .presignedSetIntAttribute( + await collectionOwner.getAddress(), + collectionAddress, + tokenId, + 'X', + -10n, + 9999999999n, + intV, + intR, + intS, + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, 1, 'X', -10); await expect( tokenAttributes .connect(tokenOwner) @@ -1640,7 +1609,7 @@ describe('RMRKTokenAttributesRepository', async function () { }); }); -async function shouldBehaveLikeTokenAttributesRepositoryInterface() { +async function shouldBehaveLikeAttributesRepositoryInterface() { it('can support IERC165', async function () { expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); }); diff --git a/test/interfaces.ts b/test/interfaces.ts index aab29664..27d083bc 100644 --- a/test/interfaces.ts +++ b/test/interfaces.ts @@ -7,7 +7,7 @@ export const IERC6220 = '0x28bc9ae4'; // Equippable and Composable export const IERC6454 = '0x91a6262f'; // Soulbound export const IERC7401 = '0x42b0e56f'; // Nestable export const IERC7409 = '0x1b3327ab'; // Emotes Repository -export const IERC7508 = '0x62ee8e7a'; // Attributes Repository +export const IERC7508 = '0x502f80e4'; // Attributes Repository export const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder export const IOtherInterface = '0xffffffff'; export const IRMRKCatalog = '0xd912401f'; // ERC6220 From 8794912262aadd71e8ce3342dd8286889f11328e Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 15 Mar 2024 08:11:34 -0500 Subject: [PATCH 10/15] Renames Issuer for Owner in token attributes. Renames methods to set and get collection attributes metadata to make it explicit they are per collection. --- .../extension/tokenAttributes/IERC7508.sol | 30 +++---- .../RMRKTokenAttributesRepository.sol | 88 +++++++------------ 2 files changed, 49 insertions(+), 69 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol index c5afb16d..497298eb 100644 --- a/contracts/RMRK/extension/tokenAttributes/IERC7508.sol +++ b/contracts/RMRK/extension/tokenAttributes/IERC7508.sol @@ -12,16 +12,16 @@ import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface IERC7508 is IERC165 { /** * @notice A list of supported access types. - * @return The `Issuer` type, where only the issuer can manage the parameter. + * @return The `Owner` type, where only the owner can manage the parameter. * @return The `Collaborator` type, where only the collaborators can manage the parameter. - * @return The `IssuerOrCollaborator` type, where only the issuer or collaborators can manage the parameter. + * @return The `OwnerOrCollaborator` type, where only the owner or collaborators can manage the parameter. * @return The `TokenOwner` type, where only the token owner can manage the parameters of their tokens. * @return The `SpecificAddress` type, where only specific addresses can manage the parameter. */ enum AccessType { - Issuer, + Owner, Collaborator, - IssuerOrCollaborator, + OwnerOrCollaborator, TokenOwner, SpecificAddress } @@ -89,14 +89,14 @@ interface IERC7508 is IERC165 { /** * @notice Used to notify listeners that a new collection has been registered to use the repository. * @param collection Address of the collection - * @param issuer Address of the issuer of the collection; the addess authorized to manage the access control + * @param owner Address of the owner of the collection; the addess authorized to manage the access control * @param registeringAddress Address that registered the collection * @param useOwnable A boolean value indicating whether the collection uses the Ownable extension to verify the - * issuer (`true`) or not (`false`) + * owner (`true`) or not (`false`) */ event AccessControlRegistration( address indexed collection, - address indexed issuer, + address indexed owner, address indexed registeringAddress, bool useOwnable ); @@ -256,25 +256,25 @@ interface IERC7508 is IERC165 { * @dev If the collection does not implement the Ownable interface, the `useOwnable` value must be set to `false`. * @dev Emits an {AccessControlRegistration} event. * @param collection The address of the collection that will use the RMRK token attributes repository. - * @param issuer The address of the issuer of the collection. + * @param owner The address of the owner of the collection. * @param useOwnable The boolean value to indicate if the collection implements the Ownable interface and whether it - * should be used to validate that the caller is the issuer (`true`) or to use the manually set issuer address + * should be used to validate that the caller is the owner (`true`) or to use the manually set owner address * (`false`). */ function registerAccessControl( address collection, - address issuer, + address owner, bool useOwnable ) external; /** * @notice Used to manage the access control settings for a specific parameter. - * @dev Only the `issuer` of the collection can call this function. + * @dev Only the `owner` of the collection can call this function. * @dev The possible `accessType` values are: * [ - * Issuer, + * Owner, * Collaborator, - * IssuerOrCollaborator, + * OwnerOrCollaborator, * TokenOwner, * SpecificAddress, * ] @@ -314,7 +314,7 @@ interface IERC7508 is IERC165 { * @param collection Address of the collection * @return attributesMetadataURI The URI of the attributes metadata */ - function getAttributesMetadataURI( + function getAttributesMetadataURIForCollection( address collection ) external view returns (string memory attributesMetadataURI); @@ -324,7 +324,7 @@ interface IERC7508 is IERC165 { * @param collection Address of the collection * @param attributesMetadataURI The URI of the attributes metadata */ - function setAttributesMetadataURI( + function setAttributesMetadataURIForCollection( address collection, string memory attributesMetadataURI ) external; diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index 4f4f693e..47161d12 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -52,8 +52,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { private _parameterAccessType; mapping(address collection => mapping(uint256 parameterId => address specificAddress)) private _parameterSpecificAddress; - mapping(address collection => IssuerSetting setting) - private _issuerSettings; + mapping(address collection => OwnerSetting setting) private _ownerSettings; mapping(address collection => mapping(address collaborator => bool isCollaborator)) private _collaborators; @@ -77,26 +76,26 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { mapping(address collection => mapping(uint256 => mapping(uint256 => string))) private _stringValues; - struct IssuerSetting { + struct OwnerSetting { bool registered; bool useOwnable; - address issuer; + address owner; } /// Used to signal that the length of the arrays is not equal. error LengthsMismatch(); /// Used to signal that the smart contract interacting with the repository does not implement Ownable pattern. error OwnableNotImplemented(); - /// Used to signal that the caller is not the issuer of the collection. - error NotCollectionIssuer(); + /// Used to signal that the caller is not the owner of the collection. + error NotCollectionOwner(); /// Used to signal that the collaborator and collaborator rights array are not of equal length. error CollaboratorArraysNotEqualLength(); /// Used to signal that the collection is not registered in the repository yet. error CollectionNotRegistered(); /// Used to signal that the caller is not aa collaborator of the collection. error NotCollectionCollaborator(); - /// Used to signal that the caller is not the issuer or a collaborator of the collection. - error NotCollectionIssuerOrCollaborator(); + /// Used to signal that the caller is not the owner or a collaborator of the collection. + error NotCollectionOwnerOrCollaborator(); /// Used to signal that the caller is not the owner of the token. error NotTokenOwner(); /// Used to signal that the caller is not the specific address allowed to manage the attribute. @@ -111,7 +110,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { */ function registerAccessControl( address collection, - address issuer, + address owner, bool useOwnable ) external { (bool ownableSuccess, bytes memory ownableReturn) = collection.call( @@ -125,18 +124,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ownableSuccess && address(uint160(uint256(bytes32(ownableReturn)))) != _msgSender() ) { - revert NotCollectionIssuer(); + revert NotCollectionOwner(); } - _issuerSettings[collection] = IssuerSetting({ + _ownerSettings[collection] = OwnerSetting({ registered: true, - issuer: issuer, + owner: owner, useOwnable: useOwnable }); emit AccessControlRegistration( collection, - issuer, + owner, _msgSender(), useOwnable ); @@ -150,7 +149,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { string memory key, AccessType accessType, address specificAddress - ) external onlyRegisteredCollection(collection) onlyIssuer(collection) { + ) external onlyRegisteredCollection(collection) onlyOwner(collection) { uint256 parameterId = _getIdForKey(key); _parameterAccessType[collection][parameterId] = accessType; @@ -166,7 +165,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { address collection, address[] memory collaboratorAddresses, bool[] memory collaboratorAddressAccess - ) external onlyRegisteredCollection(collection) onlyIssuer(collection) { + ) external onlyRegisteredCollection(collection) onlyOwner(collection) { uint256 length = collaboratorAddresses.length; if (length != collaboratorAddressAccess.length) { revert CollaboratorArraysNotEqualLength(); @@ -189,7 +188,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getAttributesMetadataURI( + function getAttributesMetadataURIForCollection( address collection ) external view returns (string memory attributesMetadataURI) { attributesMetadataURI = _attributesMetadataURIs[collection]; @@ -198,10 +197,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setAttributesMetadataURI( + function setAttributesMetadataURIForCollection( address collection, string memory attributesMetadataURI - ) external onlyIssuer(collection) { + ) external onlyOwner(collection) { _attributesMetadataURIs[collection] = attributesMetadataURI; emit MetadataURIUpdated(collection, attributesMetadataURI); } @@ -229,47 +228,28 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { specificAddress; } - /** - * @notice Modifier to check if the caller is authorized to call the function. - * @dev If the authorization is set to TokenOwner and the tokenId provided is of the non-existent token, the - * execution will revert with `ERC721InvalidTokenId` rather than `NotTokenOwner`. - * @dev The tokenId parameter is only needed for the TokenOwner authorization type, other authorization types ignore - * it. - * @param collection The address of the collection. - * @param key Key of the attribute. - * @param tokenId The ID of the token. - */ - modifier onlyAuthorizedCaller( - address collection, - string memory key, - uint256 tokenId - ) { - _onlyAuthorizedCaller(_msgSender(), collection, key, tokenId); - _; - } - /** * @notice Modifier to check if the collection is registered. * @param collection Address of the collection. */ modifier onlyRegisteredCollection(address collection) { - if (!_issuerSettings[collection].registered) { + if (!_ownerSettings[collection].registered) { revert CollectionNotRegistered(); } _; } /** - * @notice Modifier to check if the caller is the issuer of the collection. + * @notice Modifier to check if the caller is the owner of the collection. * @param collection Address of the collection. */ - modifier onlyIssuer(address collection) { - if (_issuerSettings[collection].useOwnable) { + modifier onlyOwner(address collection) { + if (_ownerSettings[collection].useOwnable) { if (Ownable(collection).owner() != _msgSender()) { - revert NotCollectionIssuer(); + revert NotCollectionOwner(); } - } else if (_issuerSettings[collection].issuer != _msgSender()) { - revert NotCollectionIssuer(); + } else if (_ownerSettings[collection].owner != _msgSender()) { + revert NotCollectionOwner(); } _; } @@ -291,27 +271,27 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ]; if ( - accessType == AccessType.Issuer && - ((_issuerSettings[collection].useOwnable && + accessType == AccessType.Owner && + ((_ownerSettings[collection].useOwnable && Ownable(collection).owner() != caller) || - (!_issuerSettings[collection].useOwnable && - _issuerSettings[collection].issuer != caller)) + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) ) { - revert NotCollectionIssuer(); + revert NotCollectionOwner(); } else if ( accessType == AccessType.Collaborator && !_collaborators[collection][caller] ) { revert NotCollectionCollaborator(); } else if ( - accessType == AccessType.IssuerOrCollaborator && - ((_issuerSettings[collection].useOwnable && + accessType == AccessType.OwnerOrCollaborator && + ((_ownerSettings[collection].useOwnable && Ownable(collection).owner() != caller) || - (!_issuerSettings[collection].useOwnable && - _issuerSettings[collection].issuer != caller)) && + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) && !_collaborators[collection][caller] ) { - revert NotCollectionIssuerOrCollaborator(); + revert NotCollectionOwnerOrCollaborator(); } else if ( accessType == AccessType.TokenOwner && IERC721(collection).ownerOf(tokenId) != caller From 2e15e78ce4613af7f65298d6bd5593373d0095ab Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 15 Mar 2024 08:12:41 -0500 Subject: [PATCH 11/15] Adds full test coverage for token attributes. --- test/extensions/tokenAttributesRepository.ts | 1229 +++++++++++++----- test/interfaces.ts | 2 +- 2 files changed, 938 insertions(+), 293 deletions(-) diff --git a/test/extensions/tokenAttributesRepository.ts b/test/extensions/tokenAttributesRepository.ts index 1f73b8d4..977e8170 100644 --- a/test/extensions/tokenAttributesRepository.ts +++ b/test/extensions/tokenAttributesRepository.ts @@ -8,59 +8,99 @@ import { OwnableMintableERC721Mock, RMRKTokenAttributesRepository } from '../../ // --------------- FIXTURES ----------------------- enum AccessType { - Issuer, + Owner, Collaborator, - IssuerOrCollaborator, + OwnerOrCollaborator, TokenOwner, SpecificAddress, } -async function tokenAttributesFixture() { - const factory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); - const tokenAttributes = await factory.deploy(); +async function fixture() { + const tokenAttributesFactory = await ethers.getContractFactory('RMRKTokenAttributesRepository'); + const tokenAttributes = await tokenAttributesFactory.deploy(); await tokenAttributes.waitForDeployment(); - return tokenAttributes; -} - -async function ownedCollectionFixture() { - const factory = await ethers.getContractFactory('OwnableMintableERC721Mock'); + const collectionFactory = await ethers.getContractFactory('OwnableMintableERC721Mock'); const [owner, ownerOf] = await ethers.getSigners(); - const ownedCollection = await factory.deploy(owner, ownerOf); - await ownedCollection.waitForDeployment(); - - return ownedCollection; + const ownedCollection1 = await collectionFactory.deploy(owner, ownerOf); + await ownedCollection1.waitForDeployment(); + const ownedCollection2 = await collectionFactory.deploy(owner, ownerOf); + await ownedCollection2.waitForDeployment(); + + return { + tokenAttributes, + ownedCollection1, + ownedCollection2, + }; } // --------------- TESTS ----------------------- describe('RMRKTokenAttributesRepository', async function () { let tokenAttributes: RMRKTokenAttributesRepository; - let ownedCollection: OwnableMintableERC721Mock; + let ownedCollection1: OwnableMintableERC721Mock; + let ownedCollection2: OwnableMintableERC721Mock; let collectionOwner: SignerWithAddress; let tokenOwner: SignerWithAddress; let collaborator: SignerWithAddress; let collectionAddress: string; + let collectionAddress2: string; const tokenId = 1n; const tokenId2 = 2n; beforeEach(async function () { - tokenAttributes = await loadFixture(tokenAttributesFixture); - ownedCollection = await loadFixture(ownedCollectionFixture); - collectionAddress = await ownedCollection.getAddress(); + ({ tokenAttributes, ownedCollection1, ownedCollection2 } = await loadFixture(fixture)); + collectionAddress = await ownedCollection1.getAddress(); + collectionAddress2 = await ownedCollection2.getAddress(); [collectionOwner, tokenOwner, collaborator] = await ethers.getSigners(); + }); - this.tokenAttributes = tokenAttributes; - this.ownedCollection = ownedCollection; + it('can support IERC165', async function () { + expect(await tokenAttributes.supportsInterface(IERC165)).to.equal(true); + }); + + it('can support IERC7508', async function () { + expect(await tokenAttributes.supportsInterface(IERC7508)).to.equal(true); }); - shouldBehaveLikeAttributesRepositoryInterface(); + describe('Attributes Metadata URI', async function () { + beforeEach(async function () { + await tokenAttributes.registerAccessControl( + collectionAddress, + collectionOwner.address, + false, + ); + }); + + it('should allow to set the attributes metadata URI if collection owner', async function () { + await expect( + tokenAttributes.setAttributesMetadataURIForCollection(collectionAddress, 'ipfs://test'), + ).to.emit(tokenAttributes, 'MetadataURIUpdated'); + + expect(await tokenAttributes.getAttributesMetadataURIForCollection(collectionAddress)).to.eql( + 'ipfs://test', + ); + }); + + it('should not allow to set the attributes metadata URI if not collection owner', async function () { + await expect( + tokenAttributes + .connect(tokenOwner) + .setAttributesMetadataURIForCollection(collectionAddress, 'ipfs://test'), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); + }); + }); describe('Registering attributes and setting values', async function () { beforeEach(async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, + false, + ); + await tokenAttributes.registerAccessControl( + collectionAddress2, + collectionOwner.address, false, ); }); @@ -165,7 +205,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenId, [ { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, + { key: 'address2', value: collectionOwner.address }, ], [ { key: 'bool1', value: true }, @@ -208,7 +248,7 @@ describe('RMRKTokenAttributesRepository', async function () { .to.emit(tokenAttributes, 'AddressAttributeUpdated') .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) + .withArgs(collectionAddress, tokenId, 'address2', collectionOwner.address) .to.emit(tokenAttributes, 'BytesAttributeUpdated') .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') @@ -220,7 +260,7 @@ describe('RMRKTokenAttributesRepository', async function () { collectionAddress, tokenId, [ - { key: 'address1', value: await collectionOwner.getAddress() }, + { key: 'address1', value: collectionOwner.address }, { key: 'address2', value: tokenOwner.address }, ], [ @@ -242,7 +282,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenId, [ { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, + { key: 'address2', value: collectionOwner.address }, ], [ { key: 'bool1', value: true }, @@ -271,7 +311,7 @@ describe('RMRKTokenAttributesRepository', async function () { .to.emit(tokenAttributes, 'AddressAttributeUpdated') .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()) + .withArgs(collectionAddress, tokenId, 'address2', collectionOwner.address) .to.emit(tokenAttributes, 'BytesAttributeUpdated') .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') .to.emit(tokenAttributes, 'BytesAttributeUpdated') @@ -304,7 +344,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenId, [ { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, + { key: 'address2', value: collectionOwner.address }, ], [ { key: 'bool1', value: true }, @@ -340,7 +380,7 @@ describe('RMRKTokenAttributesRepository', async function () { ['uint1', 'uint2'], ), ).to.eql([ - [tokenOwner.address, await collectionOwner.getAddress()], + [tokenOwner.address, collectionOwner.address], [true, false], ['0x1234', '0x5678'], [-10n, 2n], @@ -349,184 +389,807 @@ describe('RMRKTokenAttributesRepository', async function () { ]); }); - it('can set multiple string attributes at the same time', async function () { - await expect( - tokenAttributes.setStringAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'string1', value: 'value1' }, - { key: 'string2', value: 'value2' }, - ], - ), - ) - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string1', 'value1') - .to.emit(tokenAttributes, 'StringAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'string2', 'value2'); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - [], - [], - [], - [], - ['string1', 'string2'], - [], - ), - ).to.eql([[], [], [], [], ['value1', 'value2'], []]); - }); - - it('can set multiple uint attributes at the same time', async function () { - await expect( - tokenAttributes.setUintAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'uint1', value: 1n }, - { key: 'uint2', value: 2n }, - ], - ), - ) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint1', 1n) - .to.emit(tokenAttributes, 'UintAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'uint2', 2n); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - [], - [], - [], - [], - [], - ['uint1', 'uint2'], - ), - ).to.eql([[], [], [], [], [], [1n, 2n]]); + describe('Batch setters, multiple attributes, single collection and single token', async function () { + it('can set multiple string attributes at the same time', async function () { + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'string2', 'value2'); + + expect( + await tokenAttributes.getStringAttributes( + [collectionAddress], + [tokenId], + ['string1', 'string2'], + ), + ).to.eql(['value1', 'value2']); + }); + + it('can set multiple uint attributes at the same time', async function () { + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'uint2', 2n); + + expect( + await tokenAttributes.getUintAttributes( + [collectionAddress], + [tokenId], + ['uint1', 'uint2'], + ), + ).to.eql([1n, 2n]); + }); + + it('can set multiple int attributes at the same time', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int2', 2n); + + expect( + await tokenAttributes.getIntAttributes([collectionAddress], [tokenId], ['int1', 'int2']), + ).to.eql([-10n, 2n]); + }); + + it('can set multiple bool attributes at the same time', async function () { + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bool2', false); + + expect( + await tokenAttributes.getBoolAttributes( + [collectionAddress], + [tokenId], + ['bool1', 'bool2'], + ), + ).to.eql([true, false]); + }); + + it('can set multiple address attributes at the same time', async function () { + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: collectionOwner.address }, + ], + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'address2', collectionOwner.address); + + expect( + await tokenAttributes.getAddressAttributes( + [collectionAddress], + [tokenId], + ['address1', 'address2'], + ), + ).to.eql([tokenOwner.address, collectionOwner.address]); + }); + + it('can set multiple bytes attributes at the same time', async function () { + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress], + [tokenId], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); + + expect( + await tokenAttributes.getBytesAttributes( + [collectionAddress], + [tokenId], + ['bytes1', 'bytes2'], + ), + ).to.eql(['0x1234', '0x5678']); + }); }); - it('can set multiple int attributes at the same time', async function () { - await expect( - tokenAttributes.setIntAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'int1', value: -10n }, - { key: 'int2', value: 2n }, - ], - ), - ) - .to.emit(tokenAttributes, 'IntAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'int1', -10n) - .to.emit(tokenAttributes, 'IntAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'int2', 2n); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - [], - [], - [], - ['int1', 'int2'], - [], - [], - ), - ).to.eql([[], [], [], [-10n, 2n], [], []]); + describe('Batch setters, multiple attributes, single collection and multple tokens', async function () { + it('can set multiple string attributes at the same time', async function () { + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'string2', 'value2'); + + expect( + await tokenAttributes.getStringAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['string1', 'string2'], + ), + ).to.eql(['value1', 'value2']); + }); + + it('can set multiple uint attributes at the same time', async function () { + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'uint2', 2n); + + expect( + await tokenAttributes.getUintAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['uint1', 'uint2'], + ), + ).to.eql([1n, 2n]); + }); + + it('can set multiple int attributes at the same time', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'int2', 2n); + + expect( + await tokenAttributes.getIntAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['int1', 'int2'], + ), + ).to.eql([-10n, 2n]); + }); + + it('can set multiple bool attributes at the same time', async function () { + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'bool2', false); + + expect( + await tokenAttributes.getBoolAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['bool1', 'bool2'], + ), + ).to.eql([true, false]); + }); + + it('can set multiple address attributes at the same time', async function () { + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: collectionOwner.address }, + ], + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'address2', collectionOwner.address); + + expect( + await tokenAttributes.getAddressAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['address1', 'address2'], + ), + ).to.eql([tokenOwner.address, collectionOwner.address]); + }); + + it('can set multiple bytes attributes at the same time', async function () { + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress], + [tokenId, tokenId2], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'bytes2', '0x5678'); + + expect( + await tokenAttributes.getBytesAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['bytes1', 'bytes2'], + ), + ).to.eql(['0x1234', '0x5678']); + }); }); - it('can set multiple bool attributes at the same time', async function () { - await expect( - tokenAttributes.setBoolAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'bool1', value: true }, - { key: 'bool2', value: false }, - ], - ), - ) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool1', true) - .to.emit(tokenAttributes, 'BoolAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bool2', false); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - [], - ['bool1', 'bool2'], - [], - [], - [], - [], - ), - ).to.eql([[], [true, false], [], [], [], []]); + describe('Batch setters, single attribute, single collection and multple tokens', async function () { + it('can set multiple string attributes at the same time', async function () { + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'string1', value: 'value1' }], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'string1', 'value1'); + + expect( + await tokenAttributes.getStringAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['string1'], + ), + ).to.eql(['value1', 'value1']); + }); + + it('can set multiple uint attributes at the same time', async function () { + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'uint1', value: 1n }], + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'uint1', 1n); + + expect( + await tokenAttributes.getUintAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['uint1'], + ), + ).to.eql([1n, 1n]); + }); + + it('can set multiple int attributes at the same time', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'int1', value: -10n }], + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'int1', -10n); + + expect( + await tokenAttributes.getIntAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['int1'], + ), + ).to.eql([-10n, -10n]); + }); + + it('can set multiple bool attributes at the same time', async function () { + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'bool1', value: true }], + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'bool1', true); + + expect( + await tokenAttributes.getBoolAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['bool1'], + ), + ).to.eql([true, true]); + }); + + it('can set multiple address attributes at the same time', async function () { + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'address1', value: tokenOwner.address }], + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'address1', tokenOwner.address); + + expect( + await tokenAttributes.getAddressAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['address1'], + ), + ).to.eql([tokenOwner.address, tokenOwner.address]); + }); + + it('can set multiple bytes attributes at the same time', async function () { + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress], + [tokenId, tokenId2], + [{ key: 'bytes1', value: '0x1234' }], + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId2, 'bytes1', '0x1234'); + + expect( + await tokenAttributes.getBytesAttributes( + [collectionAddress], + [tokenId, tokenId2], + ['bytes1'], + ), + ).to.eql(['0x1234', '0x1234']); + }); }); - it('can set multiple address attributes at the same time', async function () { - await expect( - tokenAttributes.setAddressAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'address1', value: tokenOwner.address }, - { key: 'address2', value: await collectionOwner.getAddress() }, - ], - ), - ) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) - .to.emit(tokenAttributes, 'AddressAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'address2', await collectionOwner.getAddress()); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - ['address1', 'address2'], - [], - [], - [], - [], - [], - ), - ).to.eql([[tokenOwner.address, await collectionOwner.getAddress()], [], [], [], [], []]); + describe('Batch setters, multiple attributes, multiple collections and multple tokens', async function () { + it('can set multiple string attributes at the same time', async function () { + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), + ) + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'string1', 'value1') + .to.emit(tokenAttributes, 'StringAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'string2', 'value2'); + + expect( + await tokenAttributes.getStringAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['string1', 'string2'], + ), + ).to.eql(['value1', 'value2']); + }); + + it('can set multiple uint attributes at the same time', async function () { + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'uint1', 1n) + .to.emit(tokenAttributes, 'UintAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'uint2', 2n); + + expect( + await tokenAttributes.getUintAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['uint1', 'uint2'], + ), + ).to.eql([1n, 2n]); + }); + + it('can set multiple int attributes at the same time', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'int1', -10n) + .to.emit(tokenAttributes, 'IntAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'int2', 2n); + + expect( + await tokenAttributes.getIntAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['int1', 'int2'], + ), + ).to.eql([-10n, 2n]); + }); + + it('can set multiple bool attributes at the same time', async function () { + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), + ) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bool1', true) + .to.emit(tokenAttributes, 'BoolAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'bool2', false); + + expect( + await tokenAttributes.getBoolAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['bool1', 'bool2'], + ), + ).to.eql([true, false]); + }); + + it('can set multiple address attributes at the same time', async function () { + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: collectionOwner.address }, + ], + ), + ) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'address1', tokenOwner.address) + .to.emit(tokenAttributes, 'AddressAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'address2', collectionOwner.address); + + expect( + await tokenAttributes.getAddressAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['address1', 'address2'], + ), + ).to.eql([tokenOwner.address, collectionOwner.address]); + }); + + it('can set multiple bytes attributes at the same time', async function () { + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ) + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') + .to.emit(tokenAttributes, 'BytesAttributeUpdated') + .withArgs(collectionAddress2, tokenId2, 'bytes2', '0x5678'); + + expect( + await tokenAttributes.getBytesAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + ['bytes1', 'bytes2'], + ), + ).to.eql(['0x1234', '0x5678']); + }); }); - it('can set multiple bytes attributes at the same time', async function () { - await expect( - tokenAttributes.setBytesAttributes( - [collectionAddress], - [tokenId], - [ - { key: 'bytes1', value: '0x1234' }, - { key: 'bytes2', value: '0x5678' }, - ], - ), - ) - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes1', '0x1234') - .to.emit(tokenAttributes, 'BytesAttributeUpdated') - .withArgs(collectionAddress, tokenId, 'bytes2', '0x5678'); - - expect( - await tokenAttributes.getAttributes( - collectionAddress, - tokenId, - [], - [], - ['bytes1', 'bytes2'], - [], - [], - [], - ), - ).to.eql([[], [], ['0x1234', '0x5678'], [], [], []]); + describe('Batch setters, multiple attributes, multiple collections and multple tokens with different lengths', async function () { + it('cannot set multiple string attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'string1', value: 'value1' }, + { key: 'string2', value: 'value2' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setStringAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'string1', value: 'value1' }, + { key: 'string1', value: 'value1' }, // Additional attribute + { key: 'string2', value: 'value2' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setStringAttributes( + [ + collectionAddress, + collectionAddress, // Additional collection + collectionAddress2, + ], + [tokenId, tokenId2], + [{ key: 'string1', value: 'value1' }], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); + + it('cannot set multiple uint attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'uint1', value: 1n }, + { key: 'uint2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setUintAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'uint1', value: 1n }, + { key: 'uint1', value: 1n }, // Additional attribute + { key: 'uint2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); + + it('cannot set multiple int attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'int1', value: -10n }, + { key: 'int2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setIntAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'int1', value: -10n }, + { key: 'int1', value: -10n }, // Additional attribute + { key: 'int2', value: 2n }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); + + it('cannot set multiple bool attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'bool1', value: true }, + { key: 'bool2', value: false }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setBoolAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'bool1', value: true }, + { key: 'bool1', value: true }, // Additional attribute + { key: 'bool2', value: false }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); + + it('cannot set multiple address attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: collectionOwner.address }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address2', value: collectionOwner.address }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setAddressAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'address1', value: tokenOwner.address }, + { key: 'address1', value: tokenOwner.address }, // Additional attribute + { key: 'address2', value: collectionOwner.address }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); + + it('cannot set multiple bytes attributes at the same time if lenghts do not match', async function () { + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress, collectionAddress, collectionAddress2], // Additonal collection + [tokenId, tokenId2], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId, tokenId2], // Additonal token + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes2', value: '0x5678' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + await expect( + tokenAttributes.setBytesAttributes( + [collectionAddress, collectionAddress2], + [tokenId, tokenId2], + [ + { key: 'bytes1', value: '0x1234' }, + { key: 'bytes1', value: '0x1234' }, // Additional attribute + { key: 'bytes2', value: '0x5678' }, + ], + ), + ).to.be.revertedWithCustomError(tokenAttributes, 'LengthsMismatch'); + }); }); it('can reuse keys and values are fine', async function () { @@ -583,19 +1246,19 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .setStringAttribute(collectionAddress, tokenId, 'X', 'test description'), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to set uint values to unauthorized caller', async function () { await expect( tokenAttributes.connect(tokenOwner).setUintAttribute(collectionAddress, tokenId, 'X', 42n), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to set boolean values to unauthorized caller', async function () { await expect( tokenAttributes.connect(tokenOwner).setBoolAttribute(collectionAddress, tokenId, 'X', true), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to set address values to unauthorized caller', async function () { @@ -603,7 +1266,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to set bytes values to unauthorized caller', async function () { @@ -611,7 +1274,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .setBytesAttribute(collectionAddress, tokenId, 'X', '0x1234'), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); }); @@ -619,16 +1282,12 @@ describe('RMRKTokenAttributesRepository', async function () { it('should allow registering an already registered collection', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); await expect( - tokenAttributes.registerAccessControl( - collectionAddress, - await collectionOwner.getAddress(), - false, - ), + tokenAttributes.registerAccessControl(collectionAddress, collectionOwner.address, false), ).to.emit(tokenAttributes, 'AccessControlRegistration'); }); @@ -636,8 +1295,8 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes .connect(tokenOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + .registerAccessControl(collectionAddress, collectionOwner.address, true), + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to register a collection without Ownable implemented', async function () { @@ -646,7 +1305,7 @@ describe('RMRKTokenAttributesRepository', async function () { await expect( tokenAttributes.registerAccessControl( await erc20.getAddress(), - await collectionOwner.getAddress(), + collectionOwner.address, false, ), ).to.be.revertedWithCustomError(tokenAttributes, 'OwnableNotImplemented'); @@ -655,7 +1314,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should allow to manage access control for registered collections', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -665,7 +1324,7 @@ describe('RMRKTokenAttributesRepository', async function () { .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, tokenOwner.address, ), ) @@ -673,10 +1332,10 @@ describe('RMRKTokenAttributesRepository', async function () { .withArgs(collectionAddress, 'X', 2, tokenOwner); }); - it('should allow issuer to manage collaborators', async function () { + it('should allow owner to manage collaborators', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -697,10 +1356,10 @@ describe('RMRKTokenAttributesRepository', async function () { ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); }); - it('should not allow to manage collaborators if the caller is not the issuer', async function () { + it('should not allow to manage collaborators if the caller is not the owner', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -708,13 +1367,13 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .manageCollaborators(collectionAddress, [tokenOwner.address], [true]), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to manage collaborators for registered collections if collaborator arrays are not of equal length', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -723,7 +1382,7 @@ describe('RMRKTokenAttributesRepository', async function () { .connect(collectionOwner) .manageCollaborators( collectionAddress, - [tokenOwner.address, await collectionOwner.getAddress()], + [tokenOwner.address, collectionOwner.address], [true], ), ).to.be.revertedWithCustomError(tokenAttributes, 'CollaboratorArraysNotEqualLength'); @@ -736,16 +1395,16 @@ describe('RMRKTokenAttributesRepository', async function () { .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, tokenOwner.address, ), ).to.be.revertedWithCustomError(tokenAttributes, 'CollectionNotRegistered'); }); - it('should not allow to manage access control if the caller is not issuer', async function () { + it('should not allow to manage access control if the caller is not owner', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -755,18 +1414,14 @@ describe('RMRKTokenAttributesRepository', async function () { .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, tokenOwner.address, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should not allow to manage access control if the caller is not returned as collection owner when using ownable', async function () { - await tokenAttributes.registerAccessControl( - collectionAddress, - await collectionOwner.getAddress(), - true, - ); + await tokenAttributes.registerAccessControl(collectionAddress, collectionOwner.address, true); await expect( tokenAttributes @@ -774,16 +1429,16 @@ describe('RMRKTokenAttributesRepository', async function () { .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, tokenOwner.address, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should return the expected value when checking for collaborators', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -801,7 +1456,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should return the expected value when checking for specific addresses', async function () { await tokenAttributes.registerAccessControl( collectionAddress, - await collectionOwner.getAddress(), + collectionOwner.address, false, ); @@ -813,7 +1468,7 @@ describe('RMRKTokenAttributesRepository', async function () { .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, tokenOwner.address, ); @@ -821,32 +1476,32 @@ describe('RMRKTokenAttributesRepository', async function () { .be.true; }); - it('should use the issuer returned from the collection when using only issuer when only issuer is allowed to manage parameter', async function () { + it('should use the owner returned from the collection when using only owner when only owner is allowed to manage parameter', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true); + .registerAccessControl(collectionAddress, collectionOwner.address, true); await tokenAttributes .connect(collectionOwner) - .manageAccessControl(collectionAddress, 'X', AccessType.Issuer, ethers.ZeroAddress); + .manageAccessControl(collectionAddress, 'X', AccessType.Owner, ethers.ZeroAddress); await expect( tokenAttributes .connect(tokenOwner) .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); await expect( tokenAttributes .connect(tokenOwner) .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); it('should only allow collaborator to modify the parameters if only collaborator is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); await tokenAttributes .connect(collectionOwner) @@ -867,17 +1522,17 @@ describe('RMRKTokenAttributesRepository', async function () { ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionCollaborator'); }); - it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them', async function () { + it('should only allow owner and collaborator to modify the parameters if only owner and collaborator is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); await tokenAttributes .connect(collectionOwner) .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, ethers.ZeroAddress, ); @@ -889,7 +1544,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwnerOrCollaborator'); await tokenAttributes .connect(collectionOwner) @@ -900,17 +1555,17 @@ describe('RMRKTokenAttributesRepository', async function () { .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address); }); - it('should only allow issuer and collaborator to modify the parameters if only issuer and collaborator is allowed to modify them even when using the ownable', async function () { + it('should only allow owner and collaborator to modify the parameters if only owner and collaborator is allowed to modify them even when using the ownable', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), true); + .registerAccessControl(collectionAddress, collectionOwner.address, true); await tokenAttributes .connect(collectionOwner) .manageAccessControl( collectionAddress, 'X', - AccessType.IssuerOrCollaborator, + AccessType.OwnerOrCollaborator, ethers.ZeroAddress, ); @@ -922,7 +1577,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .setAddressAttribute(collectionAddress, tokenId, 'X', tokenOwner.address), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuerOrCollaborator'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwnerOrCollaborator'); await tokenAttributes .connect(collectionOwner) @@ -936,7 +1591,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should only allow token owner to modify the parameters if only token owner is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); await tokenAttributes .connect(collectionOwner) @@ -962,7 +1617,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should only allow specific address to modify the parameters if only specific address is allowed to modify them', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); await tokenAttributes .connect(collectionOwner) @@ -996,7 +1651,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should allow to use presigned message to modify the parameters', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( collectionAddress, @@ -1076,7 +1731,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetUintAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1094,7 +1749,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetIntAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1111,7 +1766,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetStringAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1128,7 +1783,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBoolAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1145,7 +1800,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBytesAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1162,7 +1817,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetAddressAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1180,7 +1835,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to use presigned message to modify the parameters if the deadline has elapsed', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); await mine(1000, { interval: 15 }); @@ -1250,7 +1905,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetUintAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1265,7 +1920,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetStringAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1280,7 +1935,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBoolAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1295,7 +1950,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBytesAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1310,7 +1965,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetAddressAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1326,7 +1981,7 @@ describe('RMRKTokenAttributesRepository', async function () { it('should not allow to use presigned message to modify the parameters if the setter does not match the actual signer', async function () { await tokenAttributes .connect(collectionOwner) - .registerAccessControl(collectionAddress, await collectionOwner.getAddress(), false); + .registerAccessControl(collectionAddress, collectionOwner.address, false); const uintMessage = await tokenAttributes.prepareMessageToPresignUintAttribute( collectionAddress, @@ -1394,7 +2049,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetUintAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1409,7 +2064,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetStringAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1424,7 +2079,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBoolAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1439,7 +2094,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetBytesAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1454,7 +2109,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetAddressAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1534,7 +2189,7 @@ describe('RMRKTokenAttributesRepository', async function () { tokenAttributes .connect(tokenOwner) .presignedSetUintAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1544,12 +2199,12 @@ describe('RMRKTokenAttributesRepository', async function () { uintR, uintS, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetStringAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1559,12 +2214,12 @@ describe('RMRKTokenAttributesRepository', async function () { stringR, stringS, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetBoolAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1574,12 +2229,12 @@ describe('RMRKTokenAttributesRepository', async function () { boolR, boolS, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetBytesAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1589,12 +2244,12 @@ describe('RMRKTokenAttributesRepository', async function () { bytesR, bytesS, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); await expect( tokenAttributes .connect(tokenOwner) .presignedSetAddressAttribute( - await collectionOwner.getAddress(), + collectionOwner.address, collectionAddress, tokenId, 'X', @@ -1604,17 +2259,7 @@ describe('RMRKTokenAttributesRepository', async function () { addressR, addressS, ), - ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionIssuer'); + ).to.be.revertedWithCustomError(tokenAttributes, 'NotCollectionOwner'); }); }); }); - -async function shouldBehaveLikeAttributesRepositoryInterface() { - it('can support IERC165', async function () { - expect(await this.tokenAttributes.supportsInterface(IERC165)).to.equal(true); - }); - - it('can support IERC7508', async function () { - expect(await this.tokenAttributes.supportsInterface(IERC7508)).to.equal(true); - }); -} diff --git a/test/interfaces.ts b/test/interfaces.ts index 27d083bc..35628f37 100644 --- a/test/interfaces.ts +++ b/test/interfaces.ts @@ -7,7 +7,7 @@ export const IERC6220 = '0x28bc9ae4'; // Equippable and Composable export const IERC6454 = '0x91a6262f'; // Soulbound export const IERC7401 = '0x42b0e56f'; // Nestable export const IERC7409 = '0x1b3327ab'; // Emotes Repository -export const IERC7508 = '0x502f80e4'; // Attributes Repository +export const IERC7508 = '0x212206a8'; // Attributes Repository export const IERC7590 = '0x6f87c75c'; // ERC20 Token Holder export const IOtherInterface = '0xffffffff'; export const IRMRKCatalog = '0xd912401f'; // ERC6220 From 7c28817bce7b6179d12da131347eefe024c041bf Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 15 Mar 2024 10:22:14 -0500 Subject: [PATCH 12/15] Sorts methods on RMRKTokenAttributesRepository. --- .../RMRKTokenAttributesRepository.sol | 502 +++++++++--------- 1 file changed, 257 insertions(+), 245 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index 47161d12..804dadc1 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -105,6 +105,31 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /// Used to signal that the presigned message's deadline has expired. error ExpiredDeadline(); + /** + * @inheritdoc IERC7508 + */ + function isCollaborator( + address collaborator, + address collection + ) external view returns (bool isCollaborator_) { + isCollaborator_ = _collaborators[collection][collaborator]; + } + + // ------------------- ACCESS CONTROL ------------------- + + /** + * @inheritdoc IERC7508 + */ + function isSpecificAddress( + address specificAddress, + address collection, + string memory key + ) external view returns (bool isSpecificAddress_) { + isSpecificAddress_ = + _parameterSpecificAddress[collection][_keysToIds[key]] == + specificAddress; + } + /** * @inheritdoc IERC7508 */ @@ -185,6 +210,8 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + // ------------------- METADATA URI ------------------- + /** * @inheritdoc IERC7508 */ @@ -194,285 +221,84 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributesMetadataURI = _attributesMetadataURIs[collection]; } - /** - * @inheritdoc IERC7508 - */ - function setAttributesMetadataURIForCollection( - address collection, - string memory attributesMetadataURI - ) external onlyOwner(collection) { - _attributesMetadataURIs[collection] = attributesMetadataURI; - emit MetadataURIUpdated(collection, attributesMetadataURI); - } - - /** - * @inheritdoc IERC7508 - */ - function isCollaborator( - address collaborator, - address collection - ) external view returns (bool isCollaborator_) { - isCollaborator_ = _collaborators[collection][collaborator]; - } - - /** - * @inheritdoc IERC7508 - */ - function isSpecificAddress( - address specificAddress, - address collection, - string memory key - ) external view returns (bool isSpecificAddress_) { - isSpecificAddress_ = - _parameterSpecificAddress[collection][_keysToIds[key]] == - specificAddress; - } - - /** - * @notice Modifier to check if the collection is registered. - * @param collection Address of the collection. - */ - modifier onlyRegisteredCollection(address collection) { - if (!_ownerSettings[collection].registered) { - revert CollectionNotRegistered(); - } - _; - } - - /** - * @notice Modifier to check if the caller is the owner of the collection. - * @param collection Address of the collection. - */ - modifier onlyOwner(address collection) { - if (_ownerSettings[collection].useOwnable) { - if (Ownable(collection).owner() != _msgSender()) { - revert NotCollectionOwner(); - } - } else if (_ownerSettings[collection].owner != _msgSender()) { - revert NotCollectionOwner(); - } - _; - } - - /** - * @notice Function to check if the caller is authorized to mamage a given parameter. - * @param collection The address of the collection. - * @param key Key of the attribute. - * @param tokenId The ID of the token. - */ - function _onlyAuthorizedCaller( - address caller, - address collection, - string memory key, - uint256 tokenId - ) private view { - AccessType accessType = _parameterAccessType[collection][ - _keysToIds[key] - ]; - - if ( - accessType == AccessType.Owner && - ((_ownerSettings[collection].useOwnable && - Ownable(collection).owner() != caller) || - (!_ownerSettings[collection].useOwnable && - _ownerSettings[collection].owner != caller)) - ) { - revert NotCollectionOwner(); - } else if ( - accessType == AccessType.Collaborator && - !_collaborators[collection][caller] - ) { - revert NotCollectionCollaborator(); - } else if ( - accessType == AccessType.OwnerOrCollaborator && - ((_ownerSettings[collection].useOwnable && - Ownable(collection).owner() != caller) || - (!_ownerSettings[collection].useOwnable && - _ownerSettings[collection].owner != caller)) && - !_collaborators[collection][caller] - ) { - revert NotCollectionOwnerOrCollaborator(); - } else if ( - accessType == AccessType.TokenOwner && - IERC721(collection).ownerOf(tokenId) != caller - ) { - revert NotTokenOwner(); - } else if ( - accessType == AccessType.SpecificAddress && - !(_parameterSpecificAddress[collection][_keysToIds[key]] == caller) - ) { - revert NotSpecificAddress(); - } - } + // ------------------- GETTERS ------------------- /** * @inheritdoc IERC7508 */ - function getStringAttribute( + function getAddressAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (string memory attribute) { - attribute = _stringValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (address attribute) { + attribute = _addressValues[collection][tokenId][_keysToIds[key]]; } /** * @inheritdoc IERC7508 */ - function getUintAttribute( + function getBoolAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (uint256 attribute) { - attribute = _uintValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (bool attribute) { + attribute = _boolValues[collection][tokenId][_keysToIds[key]]; } /** * @inheritdoc IERC7508 */ - function getIntAttribute( + function getBytesAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (int256 attribute) { - attribute = _intValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (bytes memory attribute) { + attribute = _bytesValues[collection][tokenId][_keysToIds[key]]; } /** * @inheritdoc IERC7508 */ - function getBoolAttribute( + function getUintAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (bool attribute) { - attribute = _boolValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (uint256 attribute) { + attribute = _uintValues[collection][tokenId][_keysToIds[key]]; } /** * @inheritdoc IERC7508 */ - function getAddressAttribute( + function getStringAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (address attribute) { - attribute = _addressValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (string memory attribute) { + attribute = _stringValues[collection][tokenId][_keysToIds[key]]; } /** * @inheritdoc IERC7508 */ - function getBytesAttribute( + function getIntAttribute( address collection, uint256 tokenId, string memory key - ) public view returns (bytes memory attribute) { - attribute = _bytesValues[collection][tokenId][_keysToIds[key]]; + ) public view returns (int256 attribute) { + attribute = _intValues[collection][tokenId][_keysToIds[key]]; } - /** - * @inheritdoc IERC7508 - */ - function getAttributes( - address collection, - uint256 tokenId, - string[] memory addressKeys, - string[] memory boolKeys, - string[] memory bytesKeys, - string[] memory intKeys, - string[] memory stringKeys, - string[] memory uintKeys - ) - external - view - returns ( - address[] memory addressAttributes, - bool[] memory boolAttributes, - bytes[] memory bytesAttributes, - int256[] memory intAttributes, - string[] memory stringAttributes, - uint256[] memory uintAttributes - ) - { - // WARNING: This implementation is a bit inneficient and differs slightly from the ERC one, to avoid stack too deep errors without using via-IR flag which would affect all other contracts in the package. This is not relevant since you should only need the interface to interact with the actual repo on each network anyway. - stringAttributes = new string[](stringKeys.length); - for (uint256 i; i < stringKeys.length; ) { - stringAttributes[i] = getStringAttribute( - collection, - tokenId, - stringKeys[i] - ); - unchecked { - ++i; - } - } - - uintAttributes = new uint256[](uintKeys.length); - for (uint256 i; i < uintKeys.length; ) { - uintAttributes[i] = getUintAttribute( - collection, - tokenId, - uintKeys[i] - ); - unchecked { - ++i; - } - } - - intAttributes = new int256[](intKeys.length); - for (uint256 i; i < intKeys.length; ) { - intAttributes[i] = getIntAttribute(collection, tokenId, intKeys[i]); - unchecked { - ++i; - } - } - - boolAttributes = new bool[](boolKeys.length); - for (uint256 i; i < boolKeys.length; ) { - boolAttributes[i] = getBoolAttribute( - collection, - tokenId, - boolKeys[i] - ); - unchecked { - ++i; - } - } - - addressAttributes = new address[](addressKeys.length); - for (uint256 i; i < addressKeys.length; ) { - addressAttributes[i] = getAddressAttribute( - collection, - tokenId, - addressKeys[i] - ); - unchecked { - ++i; - } - } - - bytesAttributes = new bytes[](bytesKeys.length); - for (uint256 i; i < bytesKeys.length; ) { - bytesAttributes[i] = getBytesAttribute( - collection, - tokenId, - bytesKeys[i] - ); - unchecked { - ++i; - } - } - } + // ------------------- BATCH GETTERS ------------------- /** * @inheritdoc IERC7508 */ - function getStringAttributes( + function getAddressAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (string[] memory attributes) { + ) public view returns (address[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -484,10 +310,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new string[](loopLength); + attributes = new address[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getStringAttribute( + attributes[i] = getAddressAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -501,11 +327,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getUintAttributes( + function getBoolAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (uint256[] memory attributes) { + ) public view returns (bool[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -517,10 +343,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new uint256[](loopLength); + attributes = new bool[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getUintAttribute( + attributes[i] = getBoolAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -534,11 +360,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getIntAttributes( + function getBytesAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (int256[] memory attributes) { + ) public view returns (bytes[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -550,10 +376,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new int256[](loopLength); + attributes = new bytes[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getIntAttribute( + attributes[i] = getBytesAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -567,11 +393,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getBoolAttributes( + function getIntAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (bool[] memory attributes) { + ) public view returns (int256[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -583,10 +409,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new bool[](loopLength); + attributes = new int256[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getBoolAttribute( + attributes[i] = getIntAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -600,11 +426,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getAddressAttributes( + function getStringAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (address[] memory attributes) { + ) public view returns (string[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -616,10 +442,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new address[](loopLength); + attributes = new string[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getAddressAttribute( + attributes[i] = getStringAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -633,11 +459,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function getBytesAttributes( + function getUintAttributes( address[] memory collections, uint256[] memory tokenIds, string[] memory attributeKeys - ) public view returns (bytes[] memory attributes) { + ) public view returns (uint256[] memory attributes) { ( bool multipleCollections, bool multipleTokens, @@ -649,10 +475,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributeKeys.length ); - attributes = new bytes[](loopLength); + attributes = new uint256[](loopLength); for (uint256 i; i < loopLength; ) { - attributes[i] = getBytesAttribute( + attributes[i] = getUintAttribute( multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], multipleAttributes ? attributeKeys[i] : attributeKeys[0] @@ -663,6 +489,192 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + /** + * @inheritdoc IERC7508 + */ + function getAttributes( + address collection, + uint256 tokenId, + string[] memory addressKeys, + string[] memory boolKeys, + string[] memory bytesKeys, + string[] memory intKeys, + string[] memory stringKeys, + string[] memory uintKeys + ) + external + view + returns ( + address[] memory addressAttributes, + bool[] memory boolAttributes, + bytes[] memory bytesAttributes, + int256[] memory intAttributes, + string[] memory stringAttributes, + uint256[] memory uintAttributes + ) + { + // WARNING: This implementation is a bit inneficient and differs slightly from the ERC one, to avoid stack too deep errors without using via-IR flag which would affect all other contracts in the package. This is not relevant since you should only need the interface to interact with the actual repo on each network anyway. + stringAttributes = new string[](stringKeys.length); + for (uint256 i; i < stringKeys.length; ) { + stringAttributes[i] = getStringAttribute( + collection, + tokenId, + stringKeys[i] + ); + unchecked { + ++i; + } + } + + uintAttributes = new uint256[](uintKeys.length); + for (uint256 i; i < uintKeys.length; ) { + uintAttributes[i] = getUintAttribute( + collection, + tokenId, + uintKeys[i] + ); + unchecked { + ++i; + } + } + + intAttributes = new int256[](intKeys.length); + for (uint256 i; i < intKeys.length; ) { + intAttributes[i] = getIntAttribute(collection, tokenId, intKeys[i]); + unchecked { + ++i; + } + } + + boolAttributes = new bool[](boolKeys.length); + for (uint256 i; i < boolKeys.length; ) { + boolAttributes[i] = getBoolAttribute( + collection, + tokenId, + boolKeys[i] + ); + unchecked { + ++i; + } + } + + addressAttributes = new address[](addressKeys.length); + for (uint256 i; i < addressKeys.length; ) { + addressAttributes[i] = getAddressAttribute( + collection, + tokenId, + addressKeys[i] + ); + unchecked { + ++i; + } + } + + bytesAttributes = new bytes[](bytesKeys.length); + for (uint256 i; i < bytesKeys.length; ) { + bytesAttributes[i] = getBytesAttribute( + collection, + tokenId, + bytesKeys[i] + ); + unchecked { + ++i; + } + } + } + + // ------------------- SETTERS ------------------- + // ------------------- BATCH SETTERS ------------------- + // ------------------- PRESIGNED SETTERS ------------------- + + /** + * @inheritdoc IERC7508 + */ + function setAttributesMetadataURIForCollection( + address collection, + string memory attributesMetadataURI + ) external onlyOwner(collection) { + _attributesMetadataURIs[collection] = attributesMetadataURI; + emit MetadataURIUpdated(collection, attributesMetadataURI); + } + + /** + * @notice Modifier to check if the collection is registered. + * @param collection Address of the collection. + */ + modifier onlyRegisteredCollection(address collection) { + if (!_ownerSettings[collection].registered) { + revert CollectionNotRegistered(); + } + _; + } + + /** + * @notice Modifier to check if the caller is the owner of the collection. + * @param collection Address of the collection. + */ + modifier onlyOwner(address collection) { + if (_ownerSettings[collection].useOwnable) { + if (Ownable(collection).owner() != _msgSender()) { + revert NotCollectionOwner(); + } + } else if (_ownerSettings[collection].owner != _msgSender()) { + revert NotCollectionOwner(); + } + _; + } + + /** + * @notice Function to check if the caller is authorized to mamage a given parameter. + * @param collection The address of the collection. + * @param key Key of the attribute. + * @param tokenId The ID of the token. + */ + function _onlyAuthorizedCaller( + address caller, + address collection, + string memory key, + uint256 tokenId + ) private view { + AccessType accessType = _parameterAccessType[collection][ + _keysToIds[key] + ]; + + if ( + accessType == AccessType.Owner && + ((_ownerSettings[collection].useOwnable && + Ownable(collection).owner() != caller) || + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) + ) { + revert NotCollectionOwner(); + } else if ( + accessType == AccessType.Collaborator && + !_collaborators[collection][caller] + ) { + revert NotCollectionCollaborator(); + } else if ( + accessType == AccessType.OwnerOrCollaborator && + ((_ownerSettings[collection].useOwnable && + Ownable(collection).owner() != caller) || + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) && + !_collaborators[collection][caller] + ) { + revert NotCollectionOwnerOrCollaborator(); + } else if ( + accessType == AccessType.TokenOwner && + IERC721(collection).ownerOf(tokenId) != caller + ) { + revert NotTokenOwner(); + } else if ( + accessType == AccessType.SpecificAddress && + !(_parameterSpecificAddress[collection][_keysToIds[key]] == caller) + ) { + revert NotSpecificAddress(); + } + } + /** * @inheritdoc IERC7508 */ From cae5f2b7156e9e1594563df6a36b9a8aae5c05d4 Mon Sep 17 00:00:00 2001 From: steven2308 Date: Fri, 15 Mar 2024 10:57:48 -0500 Subject: [PATCH 13/15] Reorders methods on token attributes repo implemention. --- .../RMRKTokenAttributesRepository.sol | 602 +++++++++--------- 1 file changed, 305 insertions(+), 297 deletions(-) diff --git a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol index 804dadc1..c9a8d13f 100644 --- a/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol +++ b/contracts/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.sol @@ -105,6 +105,47 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /// Used to signal that the presigned message's deadline has expired. error ExpiredDeadline(); + // ------------------- MODIFIERS ------------------- + + /** + * @notice Modifier to check if the collection is registered. + * @param collection Address of the collection. + */ + modifier onlyRegisteredCollection(address collection) { + if (!_ownerSettings[collection].registered) { + revert CollectionNotRegistered(); + } + _; + } + + /** + * @notice Modifier to check if the caller is the owner of the collection. + * @param collection Address of the collection. + */ + modifier onlyOwner(address collection) { + if (_ownerSettings[collection].useOwnable) { + if (Ownable(collection).owner() != _msgSender()) { + revert NotCollectionOwner(); + } + } else if (_ownerSettings[collection].owner != _msgSender()) { + revert NotCollectionOwner(); + } + _; + } + + /** + * @inheritdoc IERC165 + */ + function supportsInterface( + bytes4 interfaceId + ) public view virtual returns (bool) { + return + interfaceId == type(IERC7508).interfaceId || + interfaceId == type(IERC165).interfaceId; + } + + // ------------------- ACCESS CONTROL ------------------- + /** * @inheritdoc IERC7508 */ @@ -115,8 +156,6 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { isCollaborator_ = _collaborators[collection][collaborator]; } - // ------------------- ACCESS CONTROL ------------------- - /** * @inheritdoc IERC7508 */ @@ -221,6 +260,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributesMetadataURI = _attributesMetadataURIs[collection]; } + /** + * @inheritdoc IERC7508 + */ + function setAttributesMetadataURIForCollection( + address collection, + string memory attributesMetadataURI + ) external onlyOwner(collection) { + _attributesMetadataURIs[collection] = attributesMetadataURI; + emit MetadataURIUpdated(collection, attributesMetadataURI); + } + // ------------------- GETTERS ------------------- /** @@ -583,112 +633,22 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } - // ------------------- SETTERS ------------------- - // ------------------- BATCH SETTERS ------------------- - // ------------------- PRESIGNED SETTERS ------------------- - - /** - * @inheritdoc IERC7508 - */ - function setAttributesMetadataURIForCollection( - address collection, - string memory attributesMetadataURI - ) external onlyOwner(collection) { - _attributesMetadataURIs[collection] = attributesMetadataURI; - emit MetadataURIUpdated(collection, attributesMetadataURI); - } - - /** - * @notice Modifier to check if the collection is registered. - * @param collection Address of the collection. - */ - modifier onlyRegisteredCollection(address collection) { - if (!_ownerSettings[collection].registered) { - revert CollectionNotRegistered(); - } - _; - } - - /** - * @notice Modifier to check if the caller is the owner of the collection. - * @param collection Address of the collection. - */ - modifier onlyOwner(address collection) { - if (_ownerSettings[collection].useOwnable) { - if (Ownable(collection).owner() != _msgSender()) { - revert NotCollectionOwner(); - } - } else if (_ownerSettings[collection].owner != _msgSender()) { - revert NotCollectionOwner(); - } - _; - } - - /** - * @notice Function to check if the caller is authorized to mamage a given parameter. - * @param collection The address of the collection. - * @param key Key of the attribute. - * @param tokenId The ID of the token. - */ - function _onlyAuthorizedCaller( - address caller, - address collection, - string memory key, - uint256 tokenId - ) private view { - AccessType accessType = _parameterAccessType[collection][ - _keysToIds[key] - ]; - - if ( - accessType == AccessType.Owner && - ((_ownerSettings[collection].useOwnable && - Ownable(collection).owner() != caller) || - (!_ownerSettings[collection].useOwnable && - _ownerSettings[collection].owner != caller)) - ) { - revert NotCollectionOwner(); - } else if ( - accessType == AccessType.Collaborator && - !_collaborators[collection][caller] - ) { - revert NotCollectionCollaborator(); - } else if ( - accessType == AccessType.OwnerOrCollaborator && - ((_ownerSettings[collection].useOwnable && - Ownable(collection).owner() != caller) || - (!_ownerSettings[collection].useOwnable && - _ownerSettings[collection].owner != caller)) && - !_collaborators[collection][caller] - ) { - revert NotCollectionOwnerOrCollaborator(); - } else if ( - accessType == AccessType.TokenOwner && - IERC721(collection).ownerOf(tokenId) != caller - ) { - revert NotTokenOwner(); - } else if ( - accessType == AccessType.SpecificAddress && - !(_parameterSpecificAddress[collection][_keysToIds[key]] == caller) - ) { - revert NotSpecificAddress(); - } - } + // ------------------- PREPARE PRESIGNED MESSAGES ------------------- /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignUintAttribute( + function prepareMessageToPresignAddressAttribute( address collection, uint256 tokenId, string memory key, - uint256 value, + address value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_UINT_ATTRIBUTE_TYPEHASH, + SET_ADDRESS_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -701,17 +661,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignIntAttribute( + function prepareMessageToPresignBoolAttribute( address collection, uint256 tokenId, string memory key, - int256 value, + bool value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_UINT_ATTRIBUTE_TYPEHASH, + SET_BOOL_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -724,17 +684,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignStringAttribute( + function prepareMessageToPresignBytesAttribute( address collection, uint256 tokenId, string memory key, - string memory value, + bytes memory value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_STRING_ATTRIBUTE_TYPEHASH, + SET_BYTES_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -747,17 +707,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignBoolAttribute( + function prepareMessageToPresignIntAttribute( address collection, uint256 tokenId, string memory key, - bool value, + int256 value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_BOOL_ATTRIBUTE_TYPEHASH, + SET_UINT_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -770,17 +730,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignBytesAttribute( + function prepareMessageToPresignStringAttribute( address collection, uint256 tokenId, string memory key, - bytes memory value, + string memory value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_BYTES_ATTRIBUTE_TYPEHASH, + SET_STRING_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -793,17 +753,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function prepareMessageToPresignAddressAttribute( + function prepareMessageToPresignUintAttribute( address collection, uint256 tokenId, string memory key, - address value, + uint256 value, uint256 deadline ) public view returns (bytes32 message) { message = keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_ADDRESS_ATTRIBUTE_TYPEHASH, + SET_UINT_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -813,85 +773,89 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ); } + // ------------------- SETTERS ------------------- + /** * @inheritdoc IERC7508 */ - function setBoolAttribute( + function setAddressAttribute( address collection, uint256 tokenId, string memory key, - bool value + address value ) external { - _setBoolAttribute(_msgSender(), collection, tokenId, key, value); + _setAddressAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setBytesAttribute( + function setBoolAttribute( address collection, uint256 tokenId, string memory key, - bytes memory value + bool value ) external { - _setBytesAttribute(_msgSender(), collection, tokenId, key, value); + _setBoolAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setAddressAttribute( + function setBytesAttribute( address collection, uint256 tokenId, string memory key, - address value + bytes memory value ) external { - _setAddressAttribute(_msgSender(), collection, tokenId, key, value); + _setBytesAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setUintAttribute( + function setIntAttribute( address collection, uint256 tokenId, string memory key, - uint256 value + int256 value ) external { - _setUintAttribute(_msgSender(), collection, tokenId, key, value); + _setIntAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setIntAttribute( + function setStringAttribute( address collection, uint256 tokenId, string memory key, - int256 value + string memory value ) external { - _setIntAttribute(_msgSender(), collection, tokenId, key, value); + _setStringAttribute(_msgSender(), collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function setStringAttribute( + function setUintAttribute( address collection, uint256 tokenId, string memory key, - string memory value + uint256 value ) external { - _setStringAttribute(_msgSender(), collection, tokenId, key, value); + _setUintAttribute(_msgSender(), collection, tokenId, key, value); } + // ------------------- BATCH SETTERS ------------------- + /** * @inheritdoc IERC7508 */ - function setBoolAttributes( + function setAddressAttributes( address[] memory collections, uint256[] memory tokenIds, - BoolAttribute[] memory attributes + AddressAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -904,10 +868,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - BoolAttribute memory attribute = multipleAttributes + AddressAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setBoolAttribute( + _setAddressAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -923,10 +887,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setBytesAttributes( + function setBoolAttributes( address[] memory collections, uint256[] memory tokenIds, - BytesAttribute[] memory attributes + BoolAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -939,10 +903,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - BytesAttribute memory attribute = multipleAttributes + BoolAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setBytesAttribute( + _setBoolAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -958,10 +922,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setStringAttributes( + function setBytesAttributes( address[] memory collections, uint256[] memory tokenIds, - StringAttribute[] memory attributes + BytesAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -974,10 +938,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - StringAttribute memory attribute = multipleAttributes + BytesAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setStringAttribute( + _setBytesAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -993,10 +957,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setUintAttributes( + function setIntAttributes( address[] memory collections, uint256[] memory tokenIds, - UintAttribute[] memory attributes + IntAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -1009,10 +973,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - UintAttribute memory attribute = multipleAttributes + IntAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setUintAttribute( + _setIntAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -1028,10 +992,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setIntAttributes( + function setStringAttributes( address[] memory collections, uint256[] memory tokenIds, - IntAttribute[] memory attributes + StringAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -1044,10 +1008,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - IntAttribute memory attribute = multipleAttributes + StringAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setIntAttribute( + _setStringAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -1063,10 +1027,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { /** * @inheritdoc IERC7508 */ - function setAddressAttributes( + function setUintAttributes( address[] memory collections, uint256[] memory tokenIds, - AddressAttribute[] memory attributes + UintAttribute[] memory attributes ) external { ( bool multipleCollections, @@ -1079,10 +1043,10 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { attributes.length ); for (uint256 i; i < loopLength; ) { - AddressAttribute memory attribute = multipleAttributes + UintAttribute memory attribute = multipleAttributes ? attributes[i] : attributes[0]; - _setAddressAttribute( + _setUintAttribute( _msgSender(), multipleCollections ? collections[i] : collections[0], multipleTokens ? tokenIds[i] : tokenIds[0], @@ -1193,127 +1157,17 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } - function _checkIfMultipleCollectionsAndTokens( - address[] memory collections, - uint256[] memory tokenIds, - uint256 attributesLength - ) - internal - pure - returns ( - bool multipleCollections, - bool multipleTokens, - bool multipleAttributes, - uint256 loopLength - ) - { - multipleCollections = collections.length != 1; - multipleTokens = tokenIds.length != 1; - multipleAttributes = attributesLength != 1; - if ( - (multipleCollections && - multipleAttributes && - collections.length != attributesLength) || - (multipleTokens && - multipleAttributes && - tokenIds.length != attributesLength) || - (multipleCollections && - multipleTokens && - collections.length != tokenIds.length) - ) { - revert LengthsMismatch(); - } - - if (multipleCollections) { - loopLength = collections.length; - } else if (multipleTokens) { - loopLength = tokenIds.length; - } else { - loopLength = attributesLength; - } - } - - function _setBoolAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - bool value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _boolValues[collection][tokenId][_getIdForKey(key)] = value; - emit BoolAttributeUpdated(collection, tokenId, key, value); - } - - function _setBytesAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - bytes memory value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _bytesValues[collection][tokenId][_getIdForKey(key)] = value; - emit BytesAttributeUpdated(collection, tokenId, key, value); - } - - function _setAddressAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - address value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _addressValues[collection][tokenId][_getIdForKey(key)] = value; - emit AddressAttributeUpdated(collection, tokenId, key, value); - } - - function _setStringAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - string memory value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _stringValues[collection][tokenId][_getIdForKey(key)] = value; - emit StringAttributeUpdated(collection, tokenId, key, value); - } - - function _setUintAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - uint256 value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _uintValues[collection][tokenId][_getIdForKey(key)] = value; - emit UintAttributeUpdated(collection, tokenId, key, value); - } - - function _setIntAttribute( - address caller, - address collection, - uint256 tokenId, - string memory key, - int256 value - ) internal { - _onlyAuthorizedCaller(caller, collection, key, tokenId); - _intValues[collection][tokenId][_getIdForKey(key)] = value; - emit IntAttributeUpdated(collection, tokenId, key, value); - } + // ------------------- PRESIGNED SETTERS ------------------- /** * @inheritdoc IERC7508 */ - function presignedSetUintAttribute( + function presignedSetAddressAttribute( address setter, address collection, uint256 tokenId, string memory key, - uint256 value, + address value, uint256 deadline, uint8 v, bytes32 r, @@ -1325,7 +1179,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_UINT_ATTRIBUTE_TYPEHASH, + SET_ADDRESS_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1336,18 +1190,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setUintAttribute(setter, collection, tokenId, key, value); + _setAddressAttribute(setter, collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function presignedSetIntAttribute( + function presignedSetBoolAttribute( address setter, address collection, uint256 tokenId, string memory key, - int256 value, + bool value, uint256 deadline, uint8 v, bytes32 r, @@ -1359,7 +1213,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_UINT_ATTRIBUTE_TYPEHASH, + SET_BOOL_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1370,18 +1224,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setIntAttribute(setter, collection, tokenId, key, value); + _setBoolAttribute(setter, collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function presignedSetStringAttribute( + function presignedSetBytesAttribute( address setter, address collection, uint256 tokenId, string memory key, - string memory value, + bytes memory value, uint256 deadline, uint8 v, bytes32 r, @@ -1393,7 +1247,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_STRING_ATTRIBUTE_TYPEHASH, + SET_BYTES_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1404,18 +1258,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setStringAttribute(setter, collection, tokenId, key, value); + _setBytesAttribute(setter, collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function presignedSetBoolAttribute( + function presignedSetIntAttribute( address setter, address collection, uint256 tokenId, string memory key, - bool value, + int256 value, uint256 deadline, uint8 v, bytes32 r, @@ -1427,7 +1281,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_BOOL_ATTRIBUTE_TYPEHASH, + SET_UINT_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1438,18 +1292,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setBoolAttribute(setter, collection, tokenId, key, value); + _setIntAttribute(setter, collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function presignedSetBytesAttribute( + function presignedSetStringAttribute( address setter, address collection, uint256 tokenId, string memory key, - bytes memory value, + string memory value, uint256 deadline, uint8 v, bytes32 r, @@ -1461,7 +1315,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_BYTES_ATTRIBUTE_TYPEHASH, + SET_STRING_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1472,18 +1326,18 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setBytesAttribute(setter, collection, tokenId, key, value); + _setStringAttribute(setter, collection, tokenId, key, value); } /** * @inheritdoc IERC7508 */ - function presignedSetAddressAttribute( + function presignedSetUintAttribute( address setter, address collection, uint256 tokenId, string memory key, - address value, + uint256 value, uint256 deadline, uint8 v, bytes32 r, @@ -1495,7 +1349,7 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { keccak256( abi.encode( DOMAIN_SEPARATOR, - SET_ADDRESS_ATTRIBUTE_TYPEHASH, + SET_UINT_ATTRIBUTE_TYPEHASH, collection, tokenId, key, @@ -1506,9 +1360,11 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { ) ); _checkDeadlineAndSigner(setter, deadline, digest, v, r, s); - _setAddressAttribute(setter, collection, tokenId, key, value); + _setUintAttribute(setter, collection, tokenId, key, value); } + // ------------------- HELPERS ------------------- + function _checkDeadlineAndSigner( address setter, uint256 deadline, @@ -1526,6 +1382,97 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } + function _checkIfMultipleCollectionsAndTokens( + address[] memory collections, + uint256[] memory tokenIds, + uint256 attributesLength + ) + internal + pure + returns ( + bool multipleCollections, + bool multipleTokens, + bool multipleAttributes, + uint256 loopLength + ) + { + multipleCollections = collections.length != 1; + multipleTokens = tokenIds.length != 1; + multipleAttributes = attributesLength != 1; + if ( + (multipleCollections && + multipleAttributes && + collections.length != attributesLength) || + (multipleTokens && + multipleAttributes && + tokenIds.length != attributesLength) || + (multipleCollections && + multipleTokens && + collections.length != tokenIds.length) + ) { + revert LengthsMismatch(); + } + + if (multipleCollections) { + loopLength = collections.length; + } else if (multipleTokens) { + loopLength = tokenIds.length; + } else { + loopLength = attributesLength; + } + } + + /** + * @notice Function to check if the caller is authorized to mamage a given parameter. + * @param collection The address of the collection. + * @param key Key of the attribute. + * @param tokenId The ID of the token. + */ + function _checkOnlyAuthorizedCaller( + address caller, + address collection, + string memory key, + uint256 tokenId + ) private view { + AccessType accessType = _parameterAccessType[collection][ + _keysToIds[key] + ]; + + if ( + accessType == AccessType.Owner && + ((_ownerSettings[collection].useOwnable && + Ownable(collection).owner() != caller) || + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) + ) { + revert NotCollectionOwner(); + } else if ( + accessType == AccessType.Collaborator && + !_collaborators[collection][caller] + ) { + revert NotCollectionCollaborator(); + } else if ( + accessType == AccessType.OwnerOrCollaborator && + ((_ownerSettings[collection].useOwnable && + Ownable(collection).owner() != caller) || + (!_ownerSettings[collection].useOwnable && + _ownerSettings[collection].owner != caller)) && + !_collaborators[collection][caller] + ) { + revert NotCollectionOwnerOrCollaborator(); + } else if ( + accessType == AccessType.TokenOwner && + IERC721(collection).ownerOf(tokenId) != caller + ) { + revert NotTokenOwner(); + } else if ( + accessType == AccessType.SpecificAddress && + !(_parameterSpecificAddress[collection][_keysToIds[key]] == caller) + ) { + revert NotSpecificAddress(); + } + } + /** * @notice Used to get the Id for a key. If the key does not exist, a new ID is created. * IDs are shared among all tokens and types @@ -1543,14 +1490,75 @@ contract RMRKTokenAttributesRepository is IERC7508, Context { } } - /** - * @inheritdoc IERC165 - */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual returns (bool) { - return - interfaceId == type(IERC7508).interfaceId || - interfaceId == type(IERC165).interfaceId; + function _setAddressAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + address value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _addressValues[collection][tokenId][_getIdForKey(key)] = value; + emit AddressAttributeUpdated(collection, tokenId, key, value); + } + + function _setBoolAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + bool value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _boolValues[collection][tokenId][_getIdForKey(key)] = value; + emit BoolAttributeUpdated(collection, tokenId, key, value); + } + + function _setBytesAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + bytes memory value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _bytesValues[collection][tokenId][_getIdForKey(key)] = value; + emit BytesAttributeUpdated(collection, tokenId, key, value); + } + + function _setIntAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + int256 value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _intValues[collection][tokenId][_getIdForKey(key)] = value; + emit IntAttributeUpdated(collection, tokenId, key, value); + } + + function _setStringAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + string memory value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _stringValues[collection][tokenId][_getIdForKey(key)] = value; + emit StringAttributeUpdated(collection, tokenId, key, value); + } + + function _setUintAttribute( + address caller, + address collection, + uint256 tokenId, + string memory key, + uint256 value + ) internal { + _checkOnlyAuthorizedCaller(caller, collection, key, tokenId); + _uintValues[collection][tokenId][_getIdForKey(key)] = value; + emit UintAttributeUpdated(collection, tokenId, key, value); } } From 01c04a9b0122acda875120c2a57a5e0fea5351da Mon Sep 17 00:00:00 2001 From: steven2308 Date: Tue, 19 Mar 2024 09:43:17 -0500 Subject: [PATCH 14/15] Bumps version to 2.5.3. --- CHANGELOG.md | 13 +++++++++++++ contracts/RMRK/core/RMRKCore.sol | 2 +- package.json | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9e72100..58bbb115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [2.5.3] - 2024-03-19 + +### Changed + + - Token Attributes: Refactor on token attributes to reuse code and allow multiple collections and tokenIds on setters and getters. + - Token Attributes: Orders all methods by group and then alphabetically. + - Token Attributes: Includes methods for signed integers. + - Token Attributes: Improves tests and fixes emit assertions. + - Token Attributes: Renames Issuer for Owner in token attributes. + - Token Attributes: Renames methods to set and get collection attributes metadata to make it explicit they are per collection. Adds full test coverage for token attributes. + - Token Attributes: Updates interfaceId. + + ## [2.5.2] - 2024-03-08 ### Changed diff --git a/contracts/RMRK/core/RMRKCore.sol b/contracts/RMRK/core/RMRKCore.sol index c3f2307a..7ab37b94 100644 --- a/contracts/RMRK/core/RMRKCore.sol +++ b/contracts/RMRK/core/RMRKCore.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.21; * @dev This is currently just a passthrough contract which allows for granular editing of base-level ERC721 functions. */ contract RMRKCore { - string private constant _VERSION = "2.5.2"; + string private constant _VERSION = "2.5.3"; bytes4 private constant _RMRK_INTERFACE = 0x524D524B; // "RMRK" in ASCII hex /** diff --git a/package.json b/package.json index 48b22108..e0036506 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rmrk-team/evm-contracts", - "version": "2.5.2", + "version": "2.5.3", "license": "Apache-2.0", "files": [ "contracts/RMRK/*", From 9203a7b7dba52413a23a802c31826683fb2ae40d Mon Sep 17 00:00:00 2001 From: steven2308 Date: Tue, 19 Mar 2024 09:46:12 -0500 Subject: [PATCH 15/15] Updates docs on attributes repo. --- .../extension/tokenAttributes/IERC7508.md | 213 +++++++++++++--- .../RMRKTokenAttributesRepository.md | 238 +++++++++++++++--- 2 files changed, 391 insertions(+), 60 deletions(-) diff --git a/docs/RMRK/extension/tokenAttributes/IERC7508.md b/docs/RMRK/extension/tokenAttributes/IERC7508.md index 28ee97a7..ef575c93 100644 --- a/docs/RMRK/extension/tokenAttributes/IERC7508.md +++ b/docs/RMRK/extension/tokenAttributes/IERC7508.md @@ -2,9 +2,9 @@ *RMRK team* -> IERC7508 +> ERC-7508 Public On-Chain NFT Attributes Repository -Interface smart contract of the RMRK token properties extension. +Interface smart contract of Dynamic On-Chain Token Attributes Repository @@ -61,12 +61,12 @@ Used to get multiple address parameter values for a token. ### getAttributes ```solidity -function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (string[] stringAttributes, uint256[] uintAttributes, bool[] boolAttributes, address[] addressAttributes, bytes[] bytesAttributes) +function getAttributes(address collection, uint256 tokenId, string[] addressKeys, string[] boolKeys, string[] bytesKeys, string[] intKeys, string[] stringKeys, string[] uintKeys) external view returns (address[] addressAttributes, bool[] boolAttributes, bytes[] bytesAttributes, int256[] intAttributes, string[] stringAttributes, uint256[] uintAttributes) ``` Used to retrieve multiple token attributes of any type at once. -*The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists to the following fields (where `value` is of the appropriate type): [ key, value, ]* +*The `StringAttribute`, `UintAttribute`, `IntAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists to the following fields (where `value` is of the appropriate type): [ key, value, ]* #### Parameters @@ -74,26 +74,28 @@ Used to retrieve multiple token attributes of any type at once. |---|---|---| | collection | address | The collection address | | tokenId | uint256 | The token ID | -| stringKeys | string[] | An array of string type attribute keys to retrieve | -| uintKeys | string[] | An array of uint type attribute keys to retrieve | -| boolKeys | string[] | An array of bool type attribute keys to retrieve | | addressKeys | string[] | An array of address type attribute keys to retrieve | +| boolKeys | string[] | An array of bool type attribute keys to retrieve | | bytesKeys | string[] | An array of bytes type attribute keys to retrieve | +| intKeys | string[] | An array of int type attribute keys to retrieve | +| stringKeys | string[] | An array of string type attribute keys to retrieve | +| uintKeys | string[] | An array of uint type attribute keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | -| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | -| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | | addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | +| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | | bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | +| intAttributes | int256[] | An array of ints, in the same order as the intKeys | +| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | +| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | -### getAttributesMetadataURI +### getAttributesMetadataURIForCollection ```solidity -function getAttributesMetadataURI(address collection) external view returns (string attributesMetadataURI) +function getAttributesMetadataURIForCollection(address collection) external view returns (string attributesMetadataURI) ``` Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. @@ -208,6 +210,54 @@ Used to get multiple bytes parameter values for a token. |---|---|---| | attributes | bytes[] | An array of bytes, in the same order as the attribute keys | +### getIntAttribute + +```solidity +function getIntAttribute(address collection, uint256 tokenId, string key) external view returns (int256 attribute) +``` + +Used to retrieve the int type token attributes. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | The collection address | +| tokenId | uint256 | The token ID | +| key | string | The key of the attribute | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attribute | int256 | The value of the uint attribute | + +### getIntAttributes + +```solidity +function getIntAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (int256[] attributes) +``` + +Used to get multiple int parameter values for a token. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of int keys to retrieve | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attributes | int256[] | An array of ints, in the same order as the attribute keys | + ### getStringAttribute ```solidity @@ -240,7 +290,7 @@ function getStringAttributes(address[] collections, uint256[] tokenIds, string[] Used to get multiple sting parameter values for a token. -*The `StringAttribute` struct contains the following fields: [ string key, string value ]* + #### Parameters @@ -288,7 +338,7 @@ function getUintAttributes(address[] collections, uint256[] tokenIds, string[] a Used to get multiple uint parameter values for a token. -*The `UintAttribute` struct contains the following fields: [ string key, uint value ]* + #### Parameters @@ -359,7 +409,7 @@ function manageAccessControl(address collection, string key, enum IERC7508.Acces Used to manage the access control settings for a specific parameter. -*Only the `issuer` of the collection can call this function.The possible `accessType` values are: [ Issuer, Collaborator, IssuerOrCollaborator, TokenOwner, SpecificAddress, ]Emits an {AccessControlUpdated} event.* +*Only the `owner` of the collection can call this function.The possible `accessType` values are: [ Owner, Collaborator, OwnerOrCollaborator, TokenOwner, SpecificAddress, ]Emits an {AccessControlUpdated} event.* #### Parameters @@ -466,6 +516,32 @@ Used to retrieve the message to be signed for submitting a presigned bytes attri |---|---|---| | message | bytes32 | Raw message to be signed by the authorized account | +### prepareMessageToPresignIntAttribute + +```solidity +function prepareMessageToPresignIntAttribute(address collection, uint256 tokenId, string key, int256 value, uint256 deadline) external view returns (bytes32 message) +``` + +Used to retrieve the message to be signed for submitting a presigned int attribute change. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | The address of the collection smart contract of the token receiving the attribute | +| tokenId | uint256 | The ID of the token receiving the attribute | +| key | string | The attribute key | +| value | int256 | The attribute value | +| deadline | uint256 | The deadline timestamp for the presigned transaction after which the message is invalid | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| message | bytes32 | Raw message to be signed by the authorized account | + ### prepareMessageToPresignStringAttribute ```solidity @@ -590,6 +666,30 @@ Used to set the bytes attribute on behalf of an authorized account. | r | bytes32 | `r` value of an ECDSA signature of the presigned message | | s | bytes32 | `s` value of an ECDSA signature of the presigned message | +### presignedSetIntAttribute + +```solidity +function presignedSetIntAttribute(address setter, address collection, uint256 tokenId, string key, int256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable +``` + +Used to set the int attribute on behalf of an authorized account. + +*Emits a {IntAttributeUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| setter | address | Address of the account that presigned the attribute change | +| collection | address | Address of the collection receiving the attribute | +| tokenId | uint256 | The ID of the token receiving the attribute | +| key | string | The attribute key | +| value | int256 | The attribute value | +| deadline | uint256 | The deadline timestamp for the presigned transaction | +| v | uint8 | `v` value of an ECDSA signature of the presigned message | +| r | bytes32 | `r` value of an ECDSA signature of the presigned message | +| s | bytes32 | `s` value of an ECDSA signature of the presigned message | + ### presignedSetStringAttribute ```solidity @@ -641,7 +741,7 @@ Used to set the uint attribute on behalf of an authorized account. ### registerAccessControl ```solidity -function registerAccessControl(address collection, address issuer, bool useOwnable) external nonpayable +function registerAccessControl(address collection, address owner, bool useOwnable) external nonpayable ``` Used to register a collection to use the RMRK token attributes repository. @@ -653,8 +753,8 @@ Used to register a collection to use the RMRK token attributes repository. | Name | Type | Description | |---|---|---| | collection | address | The address of the collection that will use the RMRK token attributes repository. | -| issuer | address | The address of the issuer of the collection. | -| useOwnable | bool | The boolean value to indicate if the collection implements the Ownable interface and whether it should be used to validate that the caller is the issuer (`true`) or to use the manually set issuer address (`false`). | +| owner | address | The address of the owner of the collection. | +| useOwnable | bool | The boolean value to indicate if the collection implements the Ownable interface and whether it should be used to validate that the caller is the owner (`true`) or to use the manually set owner address (`false`). | ### setAddressAttribute @@ -696,7 +796,7 @@ function setAddressAttributes(address[] collections, uint256[] tokenIds, IERC750 ### setAttributes ```solidity -function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttribute[] stringAttributes, IERC7508.UintAttribute[] uintAttributes, IERC7508.BoolAttribute[] boolAttributes, IERC7508.AddressAttribute[] addressAttributes, IERC7508.BytesAttribute[] bytesAttributes) external nonpayable +function setAttributes(address collection, uint256 tokenId, IERC7508.AddressAttribute[] addressAttributes, IERC7508.BoolAttribute[] boolAttributes, IERC7508.BytesAttribute[] bytesAttributes, IERC7508.IntAttribute[] intAttributes, IERC7508.StringAttribute[] stringAttributes, IERC7508.UintAttribute[] uintAttributes) external nonpayable ``` @@ -709,16 +809,17 @@ function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttri |---|---|---| | collection | address | undefined | | tokenId | uint256 | undefined | -| stringAttributes | IERC7508.StringAttribute[] | undefined | -| uintAttributes | IERC7508.UintAttribute[] | undefined | -| boolAttributes | IERC7508.BoolAttribute[] | undefined | | addressAttributes | IERC7508.AddressAttribute[] | undefined | +| boolAttributes | IERC7508.BoolAttribute[] | undefined | | bytesAttributes | IERC7508.BytesAttribute[] | undefined | +| intAttributes | IERC7508.IntAttribute[] | undefined | +| stringAttributes | IERC7508.StringAttribute[] | undefined | +| uintAttributes | IERC7508.UintAttribute[] | undefined | -### setAttributesMetadataURI +### setAttributesMetadataURIForCollection ```solidity -function setAttributesMetadataURI(address collection, string attributesMetadataURI) external nonpayable +function setAttributesMetadataURIForCollection(address collection, string attributesMetadataURI) external nonpayable ``` Used to set the metadata URI for a collection, which contains all the information about the collection attributes. @@ -806,6 +907,43 @@ function setBytesAttributes(address[] collections, uint256[] tokenIds, IERC7508. | tokenIds | uint256[] | undefined | | attributes | IERC7508.BytesAttribute[] | undefined | +### setIntAttribute + +```solidity +function setIntAttribute(address collection, uint256 tokenId, string key, int256 value) external nonpayable +``` + +Used to set a signed number attribute. + +*Emits a {IntAttributeUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection receiving the attribute | +| tokenId | uint256 | The token ID | +| key | string | The attribute key | +| value | int256 | The attribute value | + +### setIntAttributes + +```solidity +function setIntAttributes(address[] collections, uint256[] tokenIds, IERC7508.IntAttribute[] attributes) external nonpayable +``` + + + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | +| attributes | IERC7508.IntAttribute[] | undefined | + ### setStringAttribute ```solidity @@ -849,7 +987,7 @@ function setStringAttributes(address[] collections, uint256[] tokenIds, IERC7508 function setUintAttribute(address collection, uint256 tokenId, string key, uint256 value) external nonpayable ``` -Used to set a number attribute. +Used to set an unsigned number attribute. *Emits a {UintAttributeUpdated} event.* @@ -909,7 +1047,7 @@ function supportsInterface(bytes4 interfaceId) external view returns (bool) ### AccessControlRegistration ```solidity -event AccessControlRegistration(address indexed collection, address indexed issuer, address indexed registeringAddress, bool useOwnable) +event AccessControlRegistration(address indexed collection, address indexed owner, address indexed registeringAddress, bool useOwnable) ``` Used to notify listeners that a new collection has been registered to use the repository. @@ -921,9 +1059,9 @@ Used to notify listeners that a new collection has been registered to use the re | Name | Type | Description | |---|---|---| | collection `indexed` | address | Address of the collection | -| issuer `indexed` | address | Address of the issuer of the collection; the addess authorized to manage the access control | +| owner `indexed` | address | Address of the owner of the collection; the addess authorized to manage the access control | | registeringAddress `indexed` | address | Address that registered the collection | -| useOwnable | bool | A boolean value indicating whether the collection uses the Ownable extension to verify the issuer (`true`) or not (`false`) | +| useOwnable | bool | A boolean value indicating whether the collection uses the Ownable extension to verify the owner (`true`) or not (`false`) | ### AccessControlUpdate @@ -1019,6 +1157,25 @@ Used to notify listeners that a new collaborator has been added or removed. | collaborator `indexed` | address | Address of the collaborator | | isCollaborator | bool | A boolean value indicating whether the collaborator has been added (`true`) or removed (`false`) | +### IntAttributeUpdated + +```solidity +event IntAttributeUpdated(address indexed collection, uint256 indexed tokenId, string key, int256 value) +``` + +Used to notify listeners that an int attribute has been updated. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection `indexed` | address | The collection address | +| tokenId `indexed` | uint256 | The token ID | +| key | string | The key of the attribute | +| value | int256 | The new value of the attribute | + ### MetadataURIUpdated ```solidity diff --git a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md index 352f69a3..1551d0ef 100644 --- a/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md +++ b/docs/RMRK/extension/tokenAttributes/RMRKTokenAttributesRepository.md @@ -72,6 +72,23 @@ function SET_BYTES_ATTRIBUTE_TYPEHASH() external view returns (bytes32) +#### Returns + +| Name | Type | Description | +|---|---|---| +| _0 | bytes32 | undefined | + +### SET_INT_ATTRIBUTE_TYPEHASH + +```solidity +function SET_INT_ATTRIBUTE_TYPEHASH() external view returns (bytes32) +``` + + + + + + #### Returns | Name | Type | Description | @@ -163,12 +180,12 @@ Used to get multiple address parameter values for a token. ### getAttributes ```solidity -function getAttributes(address collection, uint256 tokenId, string[] stringKeys, string[] uintKeys, string[] boolKeys, string[] addressKeys, string[] bytesKeys) external view returns (string[] stringAttributes, uint256[] uintAttributes, bool[] boolAttributes, address[] addressAttributes, bytes[] bytesAttributes) +function getAttributes(address collection, uint256 tokenId, string[] addressKeys, string[] boolKeys, string[] bytesKeys, string[] intKeys, string[] stringKeys, string[] uintKeys) external view returns (address[] addressAttributes, bool[] boolAttributes, bytes[] bytesAttributes, int256[] intAttributes, string[] stringAttributes, uint256[] uintAttributes) ``` Used to retrieve multiple token attributes of any type at once. -*The `StringAttribute`, `UintAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists to the following fields (where `value` is of the appropriate type): [ key, value, ]* +*The `StringAttribute`, `UintAttribute`, `IntAttribute`, `BoolAttribute`, `AddressAttribute` and `BytesAttribute` structs consists to the following fields (where `value` is of the appropriate type): [ key, value, ]* #### Parameters @@ -176,26 +193,28 @@ Used to retrieve multiple token attributes of any type at once. |---|---|---| | collection | address | The collection address | | tokenId | uint256 | The token ID | -| stringKeys | string[] | An array of string type attribute keys to retrieve | -| uintKeys | string[] | An array of uint type attribute keys to retrieve | -| boolKeys | string[] | An array of bool type attribute keys to retrieve | | addressKeys | string[] | An array of address type attribute keys to retrieve | +| boolKeys | string[] | An array of bool type attribute keys to retrieve | | bytesKeys | string[] | An array of bytes type attribute keys to retrieve | +| intKeys | string[] | An array of int type attribute keys to retrieve | +| stringKeys | string[] | An array of string type attribute keys to retrieve | +| uintKeys | string[] | An array of uint type attribute keys to retrieve | #### Returns | Name | Type | Description | |---|---|---| -| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | -| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | -| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | | addressAttributes | address[] | An array of addresses, in the same order as the addressKeys | +| boolAttributes | bool[] | An array of bools, in the same order as the boolKeys | | bytesAttributes | bytes[] | An array of bytes, in the same order as the bytesKeys | +| intAttributes | int256[] | An array of ints, in the same order as the intKeys | +| stringAttributes | string[] | An array of strings, in the same order as the stringKeys | +| uintAttributes | uint256[] | An array of uints, in the same order as the uintKeys | -### getAttributesMetadataURI +### getAttributesMetadataURIForCollection ```solidity -function getAttributesMetadataURI(address collection) external view returns (string attributesMetadataURI) +function getAttributesMetadataURIForCollection(address collection) external view returns (string attributesMetadataURI) ``` Used to retrieve the attributes metadata URI for a collection, which contains all the information about the collection attributes. @@ -310,6 +329,54 @@ Used to get multiple bytes parameter values for a token. |---|---|---| | attributes | bytes[] | An array of bytes, in the same order as the attribute keys | +### getIntAttribute + +```solidity +function getIntAttribute(address collection, uint256 tokenId, string key) external view returns (int256 attribute) +``` + +Used to retrieve the int type token attributes. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | The collection address | +| tokenId | uint256 | The token ID | +| key | string | The key of the attribute | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attribute | int256 | The value of the uint attribute | + +### getIntAttributes + +```solidity +function getIntAttributes(address[] collections, uint256[] tokenIds, string[] attributeKeys) external view returns (int256[] attributes) +``` + +Used to get multiple int parameter values for a token. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collections | address[] | Addresses of the collections, in the same order as the attribute keys. If all tokens are from the same collection the array can contain a single element with the collection address. | +| tokenIds | uint256[] | IDs of the tokens, in the same order as the attribute keys. If all attributes are for the same token the array can contain a single element with the token ID. | +| attributeKeys | string[] | An array of int keys to retrieve | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| attributes | int256[] | An array of ints, in the same order as the attribute keys | + ### getStringAttribute ```solidity @@ -342,7 +409,7 @@ function getStringAttributes(address[] collections, uint256[] tokenIds, string[] Used to get multiple sting parameter values for a token. -*The `StringAttribute` struct contains the following fields: [ string key, string value ]* + #### Parameters @@ -390,7 +457,7 @@ function getUintAttributes(address[] collections, uint256[] tokenIds, string[] a Used to get multiple uint parameter values for a token. -*The `UintAttribute` struct contains the following fields: [ string key, uint value ]* + #### Parameters @@ -461,7 +528,7 @@ function manageAccessControl(address collection, string key, enum IERC7508.Acces Used to manage the access control settings for a specific parameter. -*Only the `issuer` of the collection can call this function.The possible `accessType` values are: [ Issuer, Collaborator, IssuerOrCollaborator, TokenOwner, SpecificAddress, ]Emits an {AccessControlUpdated} event.* +*Only the `owner` of the collection can call this function.The possible `accessType` values are: [ Owner, Collaborator, OwnerOrCollaborator, TokenOwner, SpecificAddress, ]Emits an {AccessControlUpdated} event.* #### Parameters @@ -568,6 +635,32 @@ Used to retrieve the message to be signed for submitting a presigned bytes attri |---|---|---| | message | bytes32 | Raw message to be signed by the authorized account | +### prepareMessageToPresignIntAttribute + +```solidity +function prepareMessageToPresignIntAttribute(address collection, uint256 tokenId, string key, int256 value, uint256 deadline) external view returns (bytes32 message) +``` + +Used to retrieve the message to be signed for submitting a presigned int attribute change. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | The address of the collection smart contract of the token receiving the attribute | +| tokenId | uint256 | The ID of the token receiving the attribute | +| key | string | The attribute key | +| value | int256 | The attribute value | +| deadline | uint256 | The deadline timestamp for the presigned transaction after which the message is invalid | + +#### Returns + +| Name | Type | Description | +|---|---|---| +| message | bytes32 | Raw message to be signed by the authorized account | + ### prepareMessageToPresignStringAttribute ```solidity @@ -692,6 +785,30 @@ Used to set the bytes attribute on behalf of an authorized account. | r | bytes32 | `r` value of an ECDSA signature of the presigned message | | s | bytes32 | `s` value of an ECDSA signature of the presigned message | +### presignedSetIntAttribute + +```solidity +function presignedSetIntAttribute(address setter, address collection, uint256 tokenId, string key, int256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable +``` + +Used to set the int attribute on behalf of an authorized account. + +*Emits a {IntAttributeUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| setter | address | Address of the account that presigned the attribute change | +| collection | address | Address of the collection receiving the attribute | +| tokenId | uint256 | The ID of the token receiving the attribute | +| key | string | The attribute key | +| value | int256 | The attribute value | +| deadline | uint256 | The deadline timestamp for the presigned transaction | +| v | uint8 | `v` value of an ECDSA signature of the presigned message | +| r | bytes32 | `r` value of an ECDSA signature of the presigned message | +| s | bytes32 | `s` value of an ECDSA signature of the presigned message | + ### presignedSetStringAttribute ```solidity @@ -743,7 +860,7 @@ Used to set the uint attribute on behalf of an authorized account. ### registerAccessControl ```solidity -function registerAccessControl(address collection, address issuer, bool useOwnable) external nonpayable +function registerAccessControl(address collection, address owner, bool useOwnable) external nonpayable ``` Used to register a collection to use the RMRK token attributes repository. @@ -755,8 +872,8 @@ Used to register a collection to use the RMRK token attributes repository. | Name | Type | Description | |---|---|---| | collection | address | The address of the collection that will use the RMRK token attributes repository. | -| issuer | address | The address of the issuer of the collection. | -| useOwnable | bool | The boolean value to indicate if the collection implements the Ownable interface and whether it should be used to validate that the caller is the issuer (`true`) or to use the manually set issuer address (`false`). | +| owner | address | The address of the owner of the collection. | +| useOwnable | bool | The boolean value to indicate if the collection implements the Ownable interface and whether it should be used to validate that the caller is the owner (`true`) or to use the manually set owner address (`false`). | ### setAddressAttribute @@ -798,7 +915,7 @@ function setAddressAttributes(address[] collections, uint256[] tokenIds, IERC750 ### setAttributes ```solidity -function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttribute[] stringAttributes, IERC7508.UintAttribute[] uintAttributes, IERC7508.BoolAttribute[] boolAttributes, IERC7508.AddressAttribute[] addressAttributes, IERC7508.BytesAttribute[] bytesAttributes) external nonpayable +function setAttributes(address collection, uint256 tokenId, IERC7508.AddressAttribute[] addressAttributes, IERC7508.BoolAttribute[] boolAttributes, IERC7508.BytesAttribute[] bytesAttributes, IERC7508.IntAttribute[] intAttributes, IERC7508.StringAttribute[] stringAttributes, IERC7508.UintAttribute[] uintAttributes) external nonpayable ``` @@ -811,16 +928,17 @@ function setAttributes(address collection, uint256 tokenId, IERC7508.StringAttri |---|---|---| | collection | address | undefined | | tokenId | uint256 | undefined | -| stringAttributes | IERC7508.StringAttribute[] | undefined | -| uintAttributes | IERC7508.UintAttribute[] | undefined | -| boolAttributes | IERC7508.BoolAttribute[] | undefined | | addressAttributes | IERC7508.AddressAttribute[] | undefined | +| boolAttributes | IERC7508.BoolAttribute[] | undefined | | bytesAttributes | IERC7508.BytesAttribute[] | undefined | +| intAttributes | IERC7508.IntAttribute[] | undefined | +| stringAttributes | IERC7508.StringAttribute[] | undefined | +| uintAttributes | IERC7508.UintAttribute[] | undefined | -### setAttributesMetadataURI +### setAttributesMetadataURIForCollection ```solidity -function setAttributesMetadataURI(address collection, string attributesMetadataURI) external nonpayable +function setAttributesMetadataURIForCollection(address collection, string attributesMetadataURI) external nonpayable ``` Used to set the metadata URI for a collection, which contains all the information about the collection attributes. @@ -908,6 +1026,43 @@ function setBytesAttributes(address[] collections, uint256[] tokenIds, IERC7508. | tokenIds | uint256[] | undefined | | attributes | IERC7508.BytesAttribute[] | undefined | +### setIntAttribute + +```solidity +function setIntAttribute(address collection, uint256 tokenId, string key, int256 value) external nonpayable +``` + +Used to set a signed number attribute. + +*Emits a {IntAttributeUpdated} event.* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection | address | Address of the collection receiving the attribute | +| tokenId | uint256 | The token ID | +| key | string | The attribute key | +| value | int256 | The attribute value | + +### setIntAttributes + +```solidity +function setIntAttributes(address[] collections, uint256[] tokenIds, IERC7508.IntAttribute[] attributes) external nonpayable +``` + + + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collections | address[] | undefined | +| tokenIds | uint256[] | undefined | +| attributes | IERC7508.IntAttribute[] | undefined | + ### setStringAttribute ```solidity @@ -951,7 +1106,7 @@ function setStringAttributes(address[] collections, uint256[] tokenIds, IERC7508 function setUintAttribute(address collection, uint256 tokenId, string key, uint256 value) external nonpayable ``` -Used to set a number attribute. +Used to set an unsigned number attribute. *Emits a {UintAttributeUpdated} event.* @@ -1011,7 +1166,7 @@ function supportsInterface(bytes4 interfaceId) external view returns (bool) ### AccessControlRegistration ```solidity -event AccessControlRegistration(address indexed collection, address indexed issuer, address indexed registeringAddress, bool useOwnable) +event AccessControlRegistration(address indexed collection, address indexed owner, address indexed registeringAddress, bool useOwnable) ``` Used to notify listeners that a new collection has been registered to use the repository. @@ -1023,9 +1178,9 @@ Used to notify listeners that a new collection has been registered to use the re | Name | Type | Description | |---|---|---| | collection `indexed` | address | Address of the collection | -| issuer `indexed` | address | Address of the issuer of the collection; the addess authorized to manage the access control | +| owner `indexed` | address | Address of the owner of the collection; the addess authorized to manage the access control | | registeringAddress `indexed` | address | Address that registered the collection | -| useOwnable | bool | A boolean value indicating whether the collection uses the Ownable extension to verify the issuer (`true`) or not (`false`) | +| useOwnable | bool | A boolean value indicating whether the collection uses the Ownable extension to verify the owner (`true`) or not (`false`) | ### AccessControlUpdate @@ -1121,6 +1276,25 @@ Used to notify listeners that a new collaborator has been added or removed. | collaborator `indexed` | address | Address of the collaborator | | isCollaborator | bool | A boolean value indicating whether the collaborator has been added (`true`) or removed (`false`) | +### IntAttributeUpdated + +```solidity +event IntAttributeUpdated(address indexed collection, uint256 indexed tokenId, string key, int256 value) +``` + +Used to notify listeners that an int attribute has been updated. + + + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| collection `indexed` | address | The collection address | +| tokenId `indexed` | uint256 | The token ID | +| key | string | The key of the attribute | +| value | int256 | The new value of the attribute | + ### MetadataURIUpdated ```solidity @@ -1246,24 +1420,24 @@ Used to signal that the caller is not aa collaborator of the collection. -### NotCollectionIssuer +### NotCollectionOwner ```solidity -error NotCollectionIssuer() +error NotCollectionOwner() ``` -Used to signal that the caller is not the issuer of the collection. +Used to signal that the caller is not the owner of the collection. -### NotCollectionIssuerOrCollaborator +### NotCollectionOwnerOrCollaborator ```solidity -error NotCollectionIssuerOrCollaborator() +error NotCollectionOwnerOrCollaborator() ``` -Used to signal that the caller is not the issuer or a collaborator of the collection. +Used to signal that the caller is not the owner or a collaborator of the collection.